我希望将基本用户身份验证添加到我将要在AWS上使用的静态站点上,以便只有那些将提供给这些用户的用户名和密码正确的用户才能访问该站点。我找到了s3auth,这似乎正是我要寻找的东西,但是,我想知道是否需要以某种方式为除index.html之外的页面设置授权。例如,我有3个页面,分别是index,about和contact.html,而没有对about.html进行身份验证的设置是什么阻止了个人通过www.mywebsite.com/about.html直接访问该网站?我更希望获得澄清或任何人可以提供的任何资源来解释这一点!
谢谢您的帮助!
答案 0 :(得分:2)
这是Lambda @ Edge的完美用法。
由于您在S3上托管了静态网站,因此可以使用AWS的内容分发网络CloudFront轻松,非常经济(便士)为您的网站添加一些非常出色的功能,以便为您的网站提供服务。您可以学习如何使用CloudFront(包括100%免费SSL)here在S3上设置站点托管。
在部署CloudFront发行版时,您将有一些时间来设置Lambda,并将其用于执行基本用户身份验证。如果这是您第一次创建Lambda或创建供@Edge使用的Lambda,则过程将变得非常复杂,但是如果按照下面的逐步说明进行操作,则将无限制地进行无服务器基本身份验证在不到10分钟的时间内即可扩展。我将为此使用us-east-1,并且很重要的一点是要知道,如果您使用的是Lambda @ Edge,则应在us-east-1中编写函数,并将它们与CloudFront发行版关联时,将自动全局复制。让我们开始...
Function Code
部分的index.js文件中-您可以通过更改authUser和authPass变量来更新要使用的用户名和密码: 'use strict';
exports.handler = (event, context, callback) => {
// Get request and request headers
const request = event.Records[0].cf.request;
const headers = request.headers;
// 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);
};
现在您等待。在所有区域和边缘位置复制Lambda @ Edge需要几分钟(15-20)。转到CloudFront监视功能的部署。当CloudFront分布状态显示为“已部署”时,即可使用Lambda @ Edge函数。
答案 1 :(得分:1)
部署 Lambda@edge 很难通过控制台进行复制。所以我创建了 CDK Stack,您只需添加自己的凭据和域名即可部署。
https://github.com/apoorvmote/cdk-examples/tree/master/password-protect-s3-static-site
我已经用 Node12.x 测试了以下功能
exports.handler = async (event, context, callback) => {
const request = event.Records[0].cf.request
const headers = request.headers
const user = 'my-username'
const password = 'my-password'
const authString = 'Basic ' + Buffer.from(user + ':' + password).toString('base64')
if (typeof headers.authorization === 'undefined' || headers.authorization[0].value !== authString) {
const response = {
status: '401',
statusDescription: 'Unauthorized',
body: 'Unauthorized',
headers: {
'www-authenticate': [{key: 'WWW-Authenticate', value:'Basic'}]
}
}
callback(null, response)
}
callback(null, request)
}