我有一个网站在 www.mywebsite.com 上运行。这些文件与 cloudFront 结合使用托管在 S3 存储桶中。最近,我在网站上添加了一个新部分,它应该仅用于私人访问,所以我想在那里放置某种形式的保护。但是,该网站的其余部分应保持公开。我的目标是让每个人都可以访问该网站,但是一旦有人进入新部分,他们就不应该看到任何源文件,并提示输入用户名/密码组合。
例如,新部件的 URL 将是 www.mywebsite.com/private/index.html ,...
我发现 AWS Lambda 函数(带有 node.js(对此有好处,而且它有点工作。我已经设法验证了整个网站中的所有内容,但是我不知道如何使其仅在完整URL名称中包含例如"/private/*"的页面上工作。我编写的 lambda 函数如下所示:
'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 不包含我期望它包含的内容,但我似乎无法弄清楚什么包含我需要的内容。
我的猜测是 request.uri 不包含我期望它包含的内容,但我似乎无法弄清楚什么包含我需要的内容。
如果您使用的是Lambda@Edge函数(看起来您是(。然后,您可以在此处查看请求事件结构:https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/lambda-event-structure.html#lambda-event-structure-request
您可以通过使用console.log
并在 Cloudwatch 中检查相应的日志来查看请求 URI 字段的实际值。
问题可能是这一行:
if (!request.uri.toLowerCase().indexOf("/private/") > -1) {
如果你严格希望检查一个 JavaScript 字符串是否包含另一个字符串,你可能想这样做:
if (!request.uri.toLowerCase().indexOf("/private/") !== -1) {
或者更好的是,使用更现代的JS:
if (!request.uri.toLowerCase().includes("/private/")) {