Как я могу отладить AWS лямбда-авторизатор, который выдает ошибку с AuthorizerConfigurationException - PullRequest
0 голосов
/ 23 сентября 2019

У меня есть AWS Lambda Authorizer, который имеет тип запроса, я передаю sessionToken в заголовках и имя пользователя в queryString Параметры в лямбда-функциях моего Authorizer, но он дает мне ошибку {"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));
        }
    }
    });
}
};

Здесь я запрашиваю таблицу DynamodB с помощью sessionToken и имени пользователя, если она существует и имеет менее 15 минут раньше времени, в противном случае я хотел бы предоставить доступ.Но когда я тестирую свой авторизатор, он выдает ошибку

Ответы [ 2 ]

0 голосов
/ 23 сентября 2019

Поскольку вы вызываете callback внутри вашей функции validateUserSession, вы не должны вызывать ее в логике основного обработчика.Чтобы исправить это, вы можете изменить логику обработчика следующим образом.

...
if (userSessionToken && userEmailId) {
    validateUserSession(userSessionToken, userEmailId);
} else {
   callback("session token or email id is missing");
}
...
0 голосов
/ 23 сентября 2019

Когда лямбда Node.js достигает конца основного потока, он завершает все остальные потоки.

Используйте async и await и метод .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));
    }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...