API Gatewayのオーソライザーの機能を確認してみる
API Gatewayのオーソライザー機能を利用すると、認可をすることができるようになります。
「トークン」タイプと「リクエスト」タイプがあるようです。
トークンタイプ
トークンタイプの設定をしてみたいと思います。
Lambda Auth functionというLambda関数を作成する必要があります。この関数が認可機能の役割をしてくれます。
ここではauthという名前のLambda関数を作成します。コードは以下です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
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にトークンが入っています。
トークンの種類と意味です。
種類 | 意味 |
---|---|
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が叩けます。
1 2 |
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); | |
}); |
KHI入社して退社。今はCONFRAGEで正社員です。関西で140-170/80~120万から受け付けております^^
得意技はJS(ES6),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^