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(ES20xx),Java,AWSの大体のリソースです
コメントはやさしくお願いいたします^^
座右の銘は、「狭き門より入れ」「願わくは、我に七難八苦を与えたまえ」です^^








コメント