API Gatewayのオーソライザーの機能を確認してみる
API Gatewayのオーソライザー機能を利用すると、認可をすることができるようになります。
「トークン」タイプと「リクエスト」タイプがあるようです。
トークンタイプ
トークンタイプの設定をしてみたいと思います。
LambdaオーソライザーというLambda関数を作成する必要があります。この関数が認可機能の役割をしてくれます。
Lambdaオーソライザー
ここではauthという名前のLambda関数を作成します。コードは以下です。
exports.handler = function(event, context, callback) { var token = event.authorizationToken; switch (token.toLowerCase()) { case 'allow': callback(null, generatePolicy('user', 'Allow', event.methodArn)); break; case 'deny': callback(null, generatePolicy('user', 'Deny', event.methodArn)); break; case 'unauthorized': callback("Unauthorized"); // Return a 401 Unauthorized response break; default: callback("Error: Invalid token"); } }; // Help function to generate an IAM policy var generatePolicy = function(principalId, effect, resource) { var authResponse = {}; authResponse.principalId = principalId; if (effect && resource) { var policyDocument = {}; policyDocument.Version = '2012-10-17'; policyDocument.Statement = []; var statementOne = {}; statementOne.Action = 'execute-api:Invoke'; statementOne.Effect = effect; statementOne.Resource = resource; policyDocument.Statement[0] = statementOne; authResponse.policyDocument = policyDocument; } // Optional output with custom properties of the String, Number or Boolean type. authResponse.context = { "stringKey": "stringval", "numberKey": 123, "booleanKey": true }; return authResponse; }
TOKENタイプの値は、event.authorizationTokenにトークンが入っています。
eventの中身
{ type: 'TOKEN', methodArn: 'arn:aws:execute-api:ap-northeast-1:123456789012:1b44jot3cd/XXXXInvoke-stage/GET/', authorizationToken: 'x' }
トークンの種類と意味です。
種類 | 意味 |
---|---|
allow | 許可 |
deny | 拒否 |
unauthorized | 不正 |
fail | 失敗 |
トークンのソースには「method.request.header.Authorization」を指定します。
※トークンのソースはヘッダーのkeyと一致していればOKです
「作成」をクリックすると、API GatewayにLambda関数を呼び出す権限を追加するよう促されます。「Grant & Create」を押します。
認可設定する
作成したLambda Auth functionをメソッドに対して設定します。
「メソッドリクエスト」をクリックします。
「認証」で先ほど作成したカスタムオーソライザーが表示されますので、それを設定します。
テスト
保存すると、「テスト」というリンクが表示されるのでテストすることができます。
ヘッダーに「allow」を指定して、「テスト」を押します。
これで、生成したポリシーを確認することができます。
aws-api-gateway-clientの使い方
aws-api-gateway-clientモジュールを使えばローカルからapigatewayが叩けます。
npm init -y npm install --save aws-api-gateway-client
クライアント側のindex.jsは以下です。
const apigClientFactory = require('aws-api-gateway-client').default; const apigClient = apigClientFactory.newClient({ invokeUrl:'https://xxxxxxxxxx.execute-api.ap-southeast-2.amazonaws.com', accessKey: 'YYEFE2UEI3N1IUYHZGN', secretKey: 'EEhrWCrUeCCxKggYUpUFTEn7Oa4d+oxQWE7WC8UT', sessionToken: 'SESSION_TOKEN', region: 'ap-northeast-1', apiKey: '12345678901234567890' // APIキー使用している場合はここに記載する }); const pathParams = { }; const pathTemplate = '/dev/edge' const method = 'GET'; const additionalParams = { headers: { Authentication:'xx' }, queryParams: { } }; const body = { }; apigClient.invokeApi(pathParams, pathTemplate, method, additionalParams, body) .then(function(result){ console.log(JSON.stringify(result.headers)); }).catch( function(result){ console.log(result); });
リクエストタイプ
リクエストタイプにした場合にcurlで実行した際のeventの中身です。
curl -i -X PUT "Content-Type:application/json" -H "hoge:abc" https://~~
eventの中身
{ type: 'REQUEST', methodArn: 'arn:aws:execute-api:ap-northeast-1:123456789012:1b44jot3cd/dev/PUT/hoge', resource: '/hoge', path: '/hoge', httpMethod: 'PUT', headers: { Accept: '*/*', 'Content-Type': 'application/json', hoge: 'abc', Host: '1b44jot3cd.execute-api.ap-northeast-1.amazonaws.com', 'User-Agent': 'curl/8.4.0', 'X-Amzn-Trace-Id': 'Root=1-6618b52e-41f75d5234050aee7f630220', 'X-Forwarded-For': '100.100.100.100', 'X-Forwarded-Port': '443', 'X-Forwarded-Proto': 'https' }, multiValueHeaders: { Accept: [ '*/*' ], 'Content-Type': [ 'application/json' ], hoge: [ 'abc' ], Host: [ '1b44jot3cd.execute-api.ap-northeast-1.amazonaws.com' ], 'User-Agent': [ 'curl/8.4.0' ], 'X-Amzn-Trace-Id': [ 'Root=1-6618b52e-41f75d5234050aee7f630220' ], 'X-Forwarded-For': [ '100.100.100.100' ], 'X-Forwarded-Port': [ '443' ], 'X-Forwarded-Proto': [ 'https' ] }, queryStringParameters: {}, multiValueQueryStringParameters: {}, pathParameters: {}, stageVariables: {}, requestContext: { resourceId: '40rd6o', resourcePath: '/hoge', httpMethod: 'PUT', extendedRequestId: 'WGE_TFA-NjMEnsQ=', requestTime: '12/Apr/2022:04:14:38 +0000', path: '/dev/hoge', accountId: '123456789012', protocol: 'HTTP/1.1', stage: 'dev', domainPrefix: '1b44jot3cd', requestTimeEpoch: 1712895278487, requestId: 'a6c00500-d41f-4dd3-a8f6-2f0802e19ad3', identity: { cognitoIdentityPoolId: null, accountId: null, cognitoIdentityId: null, caller: null, sourceIp: '100.100.100.100', principalOrgId: null, accessKey: null, cognitoAuthenticationType: null, cognitoAuthenticationProvider: null, userArn: null, userAgent: 'curl/8.4.0', user: null }, domainName: '1b44jot3cd.execute-api.ap-northeast-1.amazonaws.com', deploymentId: 'f04tvr', apiId: '1b44jot3cd' } }
Lambdaオーソライザーが返却する形式のJSONです。Effectに設定できる値は以下の通りです。
種類 | 意味 |
---|---|
Allow | 許可 |
Deny | 拒否 |
Unauthorized | 未認証 |
この値によってエンドポイントまで通過するか、それとも認可エラーにするかなどの動きになります。
{ "principalId": "me", "policyDocument": { "Version": "2012-10-17", "Statement": [ { "Action": "execute-api:Invoke", "Effect": "Allow", "Resource": "arn:aws:execute-api:ap-northeast-1:123456789012:1b44jot3cd/dev/PUT/hoge" } ] }, "context": { "stringKey": "stringval", "numberKey": 123, "booleanKey": true } }
contextはオプションになりますので省略可能です。設定した場合は、エンドポイントのLambdaなどに、Lambdaオーソライザーからの出力として渡されます。
取得するには、event.requestContext.authorizer.stringKey
というようにアクセスすれば取得可能です。
ドキュメント

KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^
コメント