回调似乎不适用于Lambda Node.js功能 - 可能是由于防火墙?

时间:2018-05-17 18:26:10

标签: node.js amazon-web-services aws-lambda amazon-cognito

因此,我尝试使用Lambda @ Edge函数和CloudFront触发器中的Node.js对静态S3网站进行密码保护。我使用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日志。

0 个答案:

没有答案