Кажется, что обратный вызов не работает в функции Lambda Node.js - возможно, из-за брандмауэра? - PullRequest
0 голосов
/ 17 мая 2018

Поэтому я пытаюсь защитить паролем статический веб-сайт S3, используя Node.js в функции Lambda @ Edge и триггер CloudFront.Я использую заголовок www-authenticate для получения учетных данных пользователя, декодирую полученный заголовок авторизации для получения имени пользователя / пароля, затем вызываю adminInitiateAuth (из aws-sdk) для аутентификации с помощью пула пользователей Cognito.

Вот фактический код:

'use strict';
const AWS = require('aws-sdk');

exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;
    const headers = request.headers;

    const body = 'Unauthorized';
    const response = {
        status: '401',
        statusDescription: 'Unauthorized',
        body: body,
        headers: {
            'www-authenticate': [{key: 'WWW-Authenticate', value:'Basic'}]
        },
    };

    if(typeof headers.authorization != 'undefined'){
        var decoded = new Buffer(headers.authorization[0].value.split(" ")[1], "base64").toString();
        console.log("decoded from auth header without basic: " + decoded);
        var arr = decoded.split(":");
        var user = arr[0];
        var pass = arr[1];
        console.log("user: " + user);
        console.log("pass: " + pass);

        const cognito = new AWS.CognitoIdentityServiceProvider( 'us-east-1');
        var params = {
            AuthFlow: 'ADMIN_NO_SRP_AUTH',
            ClientId: [myclientid],
            UserPoolId: [myuserpoolid],
            AuthParameters: {
                USERNAME: user,
                PASSWORD: pass,
            },
        };
        cognito.adminInitiateAuth(params, function(err, data) {
            if(err){
                console.log("failed to authenticate");   
                console.log(err, err.stack);
                callback(null, response);
            } else{
                console.log("successfully authenticated");
                console.log(data);
                callback(null, request);
            }
        });
    }

    else{
        callback(null, response);
    }
};

Не похоже, что есть проблема с самим кодом, потому что он работает нормально в большинстве случаев.Но когда я нахожусь в сети моей компании, мне постоянно предлагают ввести мое имя пользователя и пароль, даже если я ввожу его правильно.Я знаю, что в сети моей компании есть брандмауэр, но я не уверен в его настройках и в том, как это могло бы помешать аутентификации в коде.

После более тщательного тестирования кода я обнаружил нескольковещи:

  1. Даже с правильными введенными учетными данными, adminInitiateAuth, похоже, выдает ошибку (поэтому обратный вызов для продолжения запроса никогда не вызывается).Насколько я могу судить, заголовок авторизации находится в запросе, поэтому я не уверен, почему это происходит (и только в сети моей компании).
  2. Журналы CloudWatch появляются только тогда, когда я делаю запросы внесети моей компании.
...