AWS API Gateway + Authorizers

圖片來源:AWS Documentation


首先準備一個驗證後執行的 lambda function ,本範例為使用預設內容,回傳字串 “Hello from Lambda”。

接下來將該 function 添加進 API Gateway 中,再 Deploy API 。

Deploy 後將可以使用上面的 Invoke URL 確認 API 回傳是否正確

一個簡單的 API 建置就完成了,雖然沒有設定 Custom Domain Names 但這樣就夠用了。


接著就開始添加 Authorizers,首先新增一個 Authorizers 的 lambda function,本範例將直接使用 lambda blueprints 的 api-gateway-authorizer-python 。

在 api-gateway-authorizer-python 中的註解寫到,可以添加其他方式來驗證 token :

Validate the incoming token and produce the principal user identifier associated with the token. This can be accomplished in a number of ways:
1. Call out to the OAuth provider
2. Decode a JWT token inline
3. Lookup in a self-managed DB

我們先加上一個簡單的判斷:

if event['authorizationToken'] != "exampleToken":
raise Exception('Unauthorized')

如果傳送過來的 token 不是預期的 “exampleToken” 字串,我們就直接使用 raise Exception(‘Unauthorized’) 回傳401失敗。

接著修改一下範例:

policy.denyAllMethods()
#policy.allowMethod(HttpVerb.GET, '/pets/*')

修改為:

# policy.denyAllMethods()
policy.allowMethod(HttpVerb.ALL, '*')

為了使 API Gateway 能夠調用 lambda function,所以需要添加一個policy 至 role 中(注:這裡指的 role 是為接下來在添加 Authorizers 所需要的 role):

{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "*"
}
]
}

然後添加該 role 的 trusted relationship:

{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"Service": "apigateway.amazonaws.com"
},
"Action": "sts:AssumeRole"
}
]
}

回到 API Gateway 開始新增 Authorizers (API Gateway -> Authorizers -> Create New Authorizer)

  • Lambda Function: 選擇剛剛使用 blueprints 的 lambda function
  • Lambda Invoke Role: 將上面所建立的 Role ARN 填入
  • Token Source: Authorization

至 Resources 將 Authorization 加入 Method Request

之後重新 Deploy 後就可以測試 API 了。


沒有帶token:

添加token:

至此就是一個 API 添加 Authorizers 的範例了。