amazon-web-services - 我如何调试使用 AuthorizerConfigurationException 产生错误的 aws lambda 授权程序
问题描述
我有一个 AWS Lambda 授权器,它是请求类型,我在标头中传递 sessionToken,在我的授权器 lambda 函数中的 queryString 参数中传递用户名但它给了我错误{"errorMessage":"RequestId: 97d57a97-3baf-421f-aabc-88ed5f6dd4ef Process exited before completing request"}
Mon Sep 23 10:05:39 UTC 2019 : AuthorizerConfigurationException
这是我的授权 lambda 函数代码:
const AWS = require('aws-sdk');
const dynamodb = new AWS.DynamoDB({ region: 'ap-south-1', apiVersion: '2012-08-10' });
exports.handler = function(event, context, callback) {
var userSessionToken = event.headers.sessionToken;
var userEmailId = event.queryStringParameters.emailId;
var tmp = event.methodArn.split(':');
var apiGatewayArnTmp = tmp[5].split('/');
var resource = '/';
if (apiGatewayArnTmp[3]) {
resource += apiGatewayArnTmp[3];
}
var authResponse = {};
if (userSessionToken && userEmailId) {
callback(null, validateUserSession(userSessionToken, userEmailId));
} else {
callback("session token or email id is missing");
}
const generatePolicy = (principalId, effect, resource) => {
var authResponse = {};
authResponse.principalId = principalId;
if (effect && resource) {
var policyDocument = {};
policyDocument.Version = '2012-10-17'; // default version
policyDocument.Statement = [];
var statementOne = {};
statementOne.Action = 'execute-api:Invoke'; // default action
statementOne.Effect = effect;
statementOne.Resource = resource;
policyDocument.Statement[0] = statementOne;
authResponse.policyDocument = policyDocument;
}
return authResponse;
}
const generateAllow = (principalId, resource) => {
return generatePolicy(principalId, 'Allow', resource);
};
const generateDeny = (principalId, resource) => {
return generatePolicy(principalId, "Deny", resource);
}
const validateUserSession = (userSessionToken, userEmailId) => {
var params = {
Key: {
"username": {
S: userEmailId
},
"sessionToken": {
S: userSessionToken
}
},
TableName: "mytable"
};
dynamodb.getItem(params, function(err, data) {
if(err) {
callback(null, generateDeny('user', event.methodArn));
} else {
let currentUnixTime = new Date().getTime();
let sessionTime = data.Item.session_created_at.N;
let isSessionExpired = (currentUnixTime - 900) < sessionTime;
if(isSessionExpired){
callback(null, generateDeny('user', event.methodArn));
} else {
callback(null, generateAllow('user', event.methodArn));
}
}
});
}
};
在这里,我正在使用 sessionToken 和用户名查询 dynamodb 表,如果它存在并且在时间之前不到 15 分钟我想授予访问权限,否则不会。但是当我测试我的授权人时它会产生错误
解决方案
由于您正在调用函数callback
内部validateUserSession
,因此不应在主处理程序逻辑中调用它。您可以按如下方式更改处理程序逻辑来解决此问题。
...
if (userSessionToken && userEmailId) {
validateUserSession(userSessionToken, userEmailId);
} else {
callback("session token or email id is missing");
}
...
推荐阅读
- linux - SSL 无法在使用 NGINX 的 Dockerized certbot 中获取本地颁发者证书
- python - 如何获取 NetworkX 中的节点子集?
- c++ - 需要 C++ 中子模板方法的指导
- amazon-web-services - 如何在 AWS SAM 或 Cloudformation 中添加身份提供者
- html - 使用 NgContent 将内容投影到父级 - Angular 9+
- python - python请求处理具有空域的cookie
- python - 重新思考我用 Python 和 Selenium 抓取动态内容的方法
- javascript - 我正在尝试为业务方程式制作基于表格的计算器
- python - 如何在使用 df.iterrows() 时使用 pandas.Series.str?
- storybook - 如何在 Storybook 中使用 redux-toolkit?