使用AWS和S3存储桶的静态站点的基本用户身份验证

时间:2019-04-26 21:10:04

标签: amazon-web-services authentication amazon-s3 amazon-cloudfront bucket

我希望将基本用户身份验证添加到我将要在AWS上使用的静态站点上,以便只有那些将提供给这些用户的用户名和密码正确的用户才能访问该站点。我找到了s3auth,这似乎正是我要寻找的东西,但是,我想知道是否需要以某种方式为除index.html之外的页面设置授权。例如,我有3个页面,分别是index,about和contact.html,而没有对about.html进行身份验证的设置是什么阻止了个人通过www.mywebsite.com/about.html直接访问该网站?我更希望获得澄清或任何人可以提供的任何资源来解释这一点!

谢谢您的帮助!

2 个答案:

答案 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发行版关联时,将自动全局复制。让我们开始...

  1. 转到AWS控制台中的Lambda,然后单击“ Create Function
  2. 从头开始创建Lambda并为其命名
  3. 将运行时设置为Node.js 8.10
  4. 通过选择“选择或创建执行角色”为Lambda授予一些权限
  5. 给角色起一个名字
  6. 从策略模板中选择“基本Lambda @ Edge权限(用于CloudFront触发器)”
  7. 点击“创建功能”
  8. 创建Lambda后,请采用以下代码并将其粘贴到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);
};

  1. 单击右上角的“保存”。
  2. 现在,您的Lambda已保存,可以连接到CloudFront发行版了。在上方菜单中,选择操作->部署到Lambda @ Edge。
  3. 在出现的模式中,从下拉菜单中选择您先前创建的CloudFront分配,将“缓存行为”保留为*,对于CloudFront事件,将其更改为“查看器请求”,最后选择/勾选“包括正文” 。选择/勾选确认部署到Lambda @ Edge,然后单击“部署”。

现在您等待。在所有区域和边缘位置复制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)
}