因此,我尝试使用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);
}
};
代码本身似乎没有问题,因为它在大多数情况下都可以正常工作。但是,当我在我公司的网络上时,即使输入正确,我仍然会提示输入我的用户名和密码。我知道我公司的网络有防火墙,但我不确定它的设置,以及这会如何干扰代码中的身份验证。
在对代码进行测试之后,我发现了一些事情:
adminInitiateAuth
似乎也会出错(因此永远不会调用继续请求的回调)。据我所知,授权标题在请求中,所以我不确定为什么会这样(并且只在我公司的网络上)。