首页 > 解决方案 > 我如何调试使用 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 分钟我想授予访问权限,否则不会。但是当我测试我的授权人时它会产生错误

标签: amazon-web-servicesaws-lambdaaws-api-gateway

解决方案


由于您正在调用函数callback内部validateUserSession,因此不应在主处理程序逻辑中调用它。您可以按如下方式更改处理程序逻辑来解决此问题。

...
if (userSessionToken && userEmailId) {
    validateUserSession(userSessionToken, userEmailId);
} else {
   callback("session token or email id is missing");
}
...

推荐阅读