Как использовать полный URL-адрес запроса в AWS Lambda для выполнения logi c только на определенных страницах - PullRequest
1 голос
/ 08 января 2020

У меня есть веб-сайт, работающий на www.mywebsite.com. Файлы хранятся в корзине S3 в сочетании с cloudFront. Недавно я добавил на сайт новую часть, которая должна быть предназначена только для личного доступа, поэтому я хотел установить некоторую форму защиты. Однако остальная часть сайта должна оставаться опубликованной c. Моя цель - сделать сайт доступным для всех, но как только кто-то перейдет к новой части, он не должен видеть никаких исходных файлов, и ему будет предложено ввести комбинацию имени пользователя и пароля.

URL новой детали будет, например, www.mywebsite.com/private/index.html, ...

Я обнаружил, что AWS лямбда-функция (с node.js) хороша для этого, и это вроде работает. Мне удалось аутентифицировать все на всем сайте, но я не могу понять, как заставить его работать только на тех страницах, которые содержат, например, «/ private / *» в полном имени URL. Лямбда-функция, которую я написал, выглядит следующим образом:

'use strict';

exports.handler = (event, context, callback) => {


// Get request and request headers
const request = event.Records[0].cf.request;
const headers = request.headers;

  if (!request.uri.toLowerCase().indexOf("/private/") > -1) {
      // Continue request processing if authentication passed
     callback(null, request);
     return;
  }

// Configure authentication
const authUser = 'USER';
const authPass = 'PASS';

// Construct the Basic Auth string
const authString = 'Basic ' + new Buffer(authUser + ':' + authPass).toString('base64');

// Require Basic authentication
if (typeof headers.authorization == 'undefined' || headers.authorization[0].value != authString) {
    const body = 'Unauthorized';
    const response = {
        status: '401',
        statusDescription: 'Unauthorized',
        body: body,
        headers: {
            'www-authenticate': [{key: 'WWW-Authenticate', value:'Basic'}]
        },
    };
    callback(null, response);
}

// Continue request processing if authentication passed
callback(null, request);
};

Не работает следующая часть:

     if (!request.uri.toLowerCase().indexOf("/private/") > -1) {
      // Continue request processing if authentication passed
     callback(null, request);
     return;
  }

Я предполагаю, что request.uri не содержит что я ожидал, что он будет содержать, но я не могу понять, что содержит то, что мне нужно.

1 Ответ

1 голос
/ 09 января 2020

Я предполагаю, что request.uri не содержит того, что я ожидал, но я не могу понять, что содержит то, что мне нужно.

Если вы используете функцию Lambda@Edge (кажется, вы есть). Затем вы можете просмотреть структуру события запроса здесь: https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-event-structure.html#lambda -event-structure-request

Вы можете увидеть фактическое значение поля URI запроса, используя console.log и проверив соответствующие журналы в Cloudwatch.

Возможно, проблема заключается в следующей строке:

if (!request.uri.toLowerCase().indexOf("/private/") > -1) {

Если вы строго хотите проверить, содержит ли строка JavaScript еще одну строку, вы, вероятно, захотите сделать это вместо этого:

if (!request.uri.toLowerCase().indexOf("/private/") !== -1) {

Или еще лучше, используя более современные JS:

if (!request.uri.toLowerCase().includes("/private/")) {
...