リクエストパラメータベースのLambdaオーソライザ

AWS

リクエストパラメータベースの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 呼び出しロール指定なし
認可のキャッシュチェックオフ

このLambdaイベントペイロードで指定した項目がリクエストに存在しない場合、
401エラーが返却されます。

以上

タイトルとURLをコピーしました