Поэтому я пытаюсь защитить паролем статический веб-сайт 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);
}
};
Не похоже, что есть проблема с самим кодом, потому что он работает нормально в большинстве случаев.Но когда я нахожусь в сети моей компании, мне постоянно предлагают ввести мое имя пользователя и пароль, даже если я ввожу его правильно.Я знаю, что в сети моей компании есть брандмауэр, но я не уверен в его настройках и в том, как это могло бы помешать аутентификации в коде.
После более тщательного тестирования кода я обнаружил нескольковещи:
- Даже с правильными введенными учетными данными,
adminInitiateAuth
, похоже, выдает ошибку (поэтому обратный вызов для продолжения запроса никогда не вызывается).Насколько я могу судить, заголовок авторизации находится в запросе, поэтому я не уверен, почему это происходит (и только в сети моей компании). - Журналы CloudWatch появляются только тогда, когда я делаю запросы внесети моей компании.