Skip to content

Instantly share code, notes, and snippets.

@m28dev
Created November 29, 2018 02:16
Show Gist options
  • Save m28dev/9e48a4832dee0a9cf7beefd900113b37 to your computer and use it in GitHub Desktop.
Save m28dev/9e48a4832dee0a9cf7beefd900113b37 to your computer and use it in GitHub Desktop.
Sample of API Gateway Lambda authorizer
const jwt = require('jsonwebtoken');
const AWS = require('aws-sdk');
exports.handler = async (event) => {
const generatePolicy = (principalId, effect, resource) => {
const authResponse = {};
authResponse.principalId = principalId;
const policyDocument = {
Version: '2012-10-17',
Statement: [{
Action: 'execute-api:Invoke',
Effect: effect,
Resource: resource
}]
};
authResponse.policyDocument = policyDocument;
return authResponse;
};
/*
* 認証情報が入ったトークンを取得する。
* 「Authorization: Bearer <TOKEN>」で送られてくる。(入力チェックはAPI Gateway側で実施)
*/
const token = event.authorizationToken.split(' ')[1];
// 各シークレットを取得
const secretsmanager = new AWS.SecretsManager();
const secretValues = await secretsmanager.getSecretValue({ SecretId: process.env.SECRET_NAME }).promise();
const secretJson = JSON.parse(secretValues.SecretString);
const signkey = secretJson.jwt_secret;
const aud = secretJson.aud;
const iss = secretJson.iss;
// トークンの検証
try {
const decoded = jwt.verify(token, signkey, {
algorithms: ['HS256'],
audience: aud,
issuer: iss
});
/*
* ポリシーで許可するリソースを設定。
*
* 今回はmethodとresourcePathを'*'とした。
* もし特定のパスで縛りたい場合は、API Gateway側でポリシーのキャッシュを無効にしておく。
* さもないと特定のパスに絞ったポリシーがキャッシュされ、その他のパスへのアクセス時にHTTP403が返されてしまう。
*/
// methodArn example -> arn:aws:execute-api:<regionId>:<accountId>:<apiId>/<stage>/<method>/<resourcePath>
const methodArnArray = event.methodArn.split(':');
const apiGatewayArnArray = methodArnArray.pop().split('/');
const resource = `${methodArnArray.join(':')}:${apiGatewayArnArray[0]}/${apiGatewayArnArray[1]}/*`;
return generatePolicy(decoded.sub, 'Allow', resource);
}
catch (err) {
throw new Error(err);
}
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment