ここ 設計図では、APIゲートウェイは401:未承認で応答します。
私は同じraise Exception('Unauthorized')
をラムダに書き込んで、ラムダコンソールからテストすることができました。しかし、ポストマンでは、ステータス500
本文付き:
{
message: null`
}
「無効な署名」、「TokenExpired」などのカスタムエラーメッセージを追加したいのですが、ドキュメントやガイダンスをいただければ幸いです。
これは完全に可能ですが、ドキュメントはとても悪くて混乱しています。
方法は次のとおりです。
ゲートウェイ応答テンプレートでアクセスできる$context.authorizer
というオブジェクトがあります。詳しくはこちらをご覧ください https://docs.aws.Amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html
これは、承認者ラムダからこのauthorizer
オブジェクトに次のように入力する例です。
// A simple TOKEN authorizer example to demonstrate how to use an authorization token
// to allow or deny a request. In this example, the caller named 'user' is allowed to invoke
// a request if the client-supplied token value is 'allow'. The caller is not allowed to invoke
// the request if the token value is 'deny'. If the token value is 'Unauthorized', the function
// returns the 'Unauthorized' error with an HTTP status code of 401. For any other token value,
// the authorizer returns an 'Invalid token' error.
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");
}
};
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 custom anything can go here",
"numberKey": 123,
"booleanKey": true,
};
return authResponse;
}
ここで重要なのは、この部分を追加することです。
// Optional output with custom properties of the String, Number or Boolean type.
authResponse.context = {
"stringKey": "stringval custom anything can go here",
"numberKey": 123,
"booleanKey": true,
};
これは$ context.authorizerで利用可能になります
次に、ゲートウェイの応答タブで次のように本文マッピングテンプレートを設定します。
{"message":"$context.authorizer.stringKey"}
[〜#〜]注[〜#〜]:引用符で囲む必要があります!
最後に、Authorization
トークンを拒否に設定してpostmanでリクエストを送信した後、次のようなペイロードをpostmanから取得します。
{
"message": "stringval custom anything can go here"
}
カスタムリソースResponseTemplates
を使用して、@ maxwellソリューションを使用します。拒否応答は、次のように表示されます。
{
"success":false,
"message":"Custom Deny Message"
}
これを確認できます https://github.com/SeptiyanAndika/serverless-custom-authorizer
500を引き起こしている原因がわからないmessage: null
レスポンス。 Lambda関数の権限の構成が誤っている可能性があります。
Unauthorizedエラーレスポンスをカスタマイズするには、UNAUTHORIZED
エラータイプのゲートウェイレスポンスを設定します。ここで応答ヘッダーとペイロードを設定できます。
これは、context.fail()関数を使用して簡単に実現できます。
例:
const customAuthorizer: Handler = (event, context: Context, callback: Callback) => {
authenticate(event)
.then((res) => {
// result should be as described in AWS docs
callback(null, res);
})
.catch((err) => {
context.fail("Unauthorized");
});
}
これにより、次の本文とともに401
応答が返されます。
{
"message": "Unauthorized"
}
これは、エラーをスローすることでも実現できます。
throw new Error('Unauthorized');