リクエストパラメータベースのLambdaオーソライザ利用方法です。
リクエストパラメータベースの場合、以下の値をIDソースとして利用することが出来ます。
・ヘッダー
・クエリ文字列パラメータ
・ステージ変数
・$context変数
今回はヘッダーに独自の「my-access-token」を設定してIDソースとして利用します。
前提
・統合タイプ;Lambda関数
・Lambdaプロキシ統合を利用
CORS対応
独自のヘッダー項目「my-access-token」を利用するので
対象APIのOPTIONメソッドで許可する必要があります。
1) 対象APIのOPTIONメソッド > 統合レスポンスを選択
2)ヘッダーのマッピングを更新
CORSを有効にしていると「Access-Control-Allow-Headers」が
追加されており、以下のような値が設定されていると思います。
‘Content-Type,X-Amz-Date,Authorization,X-Api-Key,X-Amz-Security-Token’
ここに今回追加する「my-access-token」を追加します
Lambdaオーソライザ用関数の作成
import boto3
import json
def lambda_handler(event, context):
#トークンを取得
token = 'nobody'
if 'my-access-token' in event["headers"]:
token = event["headers"]["my-access-token"]
#リクエストされたリソースパスを取得
resourcePath = event['requestContext']['resourcePath']
# プリンシパルを設定
principalId = 'yourPrincipal'
# 存在しないリソースパスへの要求の場合は403エラー
if 認証OK:
return generate_allow_policy(principalId)
else
return generate_deny_policy('nobody')
def generate_allow_policy(principalId):
return {
"principalId" : principalId,
"policyDocument" : {
"Version" : "2012-10-17",
"Statement" : [
{
"Action": "execute-api:Invoke",
"Effect": "Allow",
"Resource": "*"
},
{
"Action": "sts:AssumeRole",
"Effect": "Allow",
"Resource": "*"
},
{
"Effect": "Allow",
"Action": "lambda:InvokeFunction",
"Resource": "*"
}]
}
}
def generate_deny_policy(principalId):
# クライアントには403エラーが返却される
return {
"principalId" : principalId,
"policyDocument" : {
"Version" : "2012-10-17",
"Statement" : [
{
"Action": "execute-api:Invoke",
"Effect": "Deny",
"Resource": "*"
}]
}
}
Lambdaオーソライザへの入力
認証の判定にリクエストパスを利用することも多いと思います。
Lambdaオーソライザへ渡される入力としては以下の3種類があります。
① “resource”: (例)”/app/hello”,
② “path”: (例)”/app/hello”,
③ “requestContext”内の”path”: (例)”/dev/app/hello”,
それぞれ以下の値が設定されてきます。
①API Gateway で定義しているリソースパスの値
②実際のリクエストパス
③ステージ名を含めた場合のリクエストパスの値
Lambdaオーソライザの設定
APIGatewayコンソール > オーソライザから作成可能です。以下のように設定します。
項目 | 内容 | 設定値 |
Lambda関数 | Lambdaオーソライザ関数 | LambdaAuthorizer (上記で作成した関数名) |
Lambdaイベントペイロード | 認証に利用する項目 | ヘッダーを選択。 項目名はmy-access-tokenを指定 |
Lambda 呼び出しロール | – | 指定なし |
認可のキャッシュ | – | チェックオフ |
以上