【问题标题】:How can i debug aws lambda authorizer that is producing error with AuthorizerConfigurationException我如何调试使用 AuthorizerConfigurationException 产生错误的 aws lambda 授权程序
【发布时间】:2019-09-23 19:25:36
【问题描述】:

我有一个 AWS Lambda 授权器,它是请求类型,我在我的授权器 lambda 函数中的标头中传递 sessionToken,在 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-services aws-lambda aws-api-gateway


    【解决方案1】:

    当 Node.js Lambda 到达主线程的末尾时,它会结束所有其他线程。

    使用asyncawait.promise() 方法对await 调用dynamodb.getItem()

    exports.handler = async function(event, context, callback) {
        var userSessionToken = ...;
        ...
        var authResponse = ...;
    
        if (userSessionToken && userEmailId) {
            callback(null, await validateUserSession(userSessionToken, userEmailId));
        }  else {
            ...
        }
    
        ...
    
    const validateUserSession = async (userSessionToken, userEmailId) => {
        var params = {
            ...
        }
        let data;
        try {
            data = await dynamodb.getItem(params).promise();
        } catch (err) {
            callback(null, generateDeny('user', event.methodArn));
        }
        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));
        }
    };
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2020-06-17
        • 1970-01-01
        • 1970-01-01
        • 2019-12-12
        • 2019-05-31
        • 1970-01-01
        • 1970-01-01
        • 2021-04-13
        • 2019-04-15
        相关资源
        最近更新 更多