我已经在一个称为Lambda函数的AWS API网关上创建了Lambda授权器。以下是用Node.js 8.0代码编写的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;
}
(以上示例代码来自网站https://markpollmann.com/lambda-authorizer/)
如果我通过传递authorizationToken无效值来保存和测试此功能,则会得到下面的预期结果。
Response:
{
"errorMessage": "Error: Invalid token"
}
Request ID:
"e93567c0-fcbb-4cb1-b0b3-28e9c1b30162"
但是,如果我从Postman调用此API,则通过在标头中传递值,将得到以下响应。对于标题中的任何值,我都会收到此错误,即拒绝,允许,未经授权,错误等。
{
"message": null
}
邮递员中的状态消息显示“ 500 Internal Server Error”。以下是邮递员标题部分的详细信息。
content-length →16
content-type →application/json
date →Fri, 08 Mar 2019 14:07:57 GMT
status →500
x-amz-apigw-id →W89kFDRDoEFxYg=
x-amzn-errortype →AuthorizerConfigurationException
x-amzn-requestid →92f31d11-41ab-11e9-9c36-97d38d96f31b
我不明白为什么Lambda测试可以正常工作时,API为什么返回上述响应和错误消息。
我已经在SO中经历了以下两个线程,但是答案/评论对我的情况无济于事。
AWS API Gateway with custom authorizer returns AuthorizerConfigurationException AWS API Gateway Custom Authorizer AuthorizerConfigurationException
答案 0 :(得分:0)
我已经理解为什么我为无效输入获取message = null的原因。切换情况下的默认块是在callback()方法中使用参数“错误:无效令牌”。 API网关仅将“允许”,“拒绝”和“未经授权”标识为有效值。这些值也区分大小写。如果将这些值以外的任何其他字符串值传递给callback()方法,则API Gateway会将message = null返回给客户端。