gpt4 book ai didi

javascript - AWS Cognito - 将静态 S3 网站的部分内容限制为登录用户

转载 作者:行者123 更新时间:2023-12-01 16:28:19 25 4
gpt4 key购买 nike

我正在构建一个我在 s3 上托管的小型静态网站。我使用 Cognito 来启动和运行一些基本的用户验证(登录、注销)。我想将网站的某些部分限制为仅登录用户。

我完成了本次研讨会的模块 2 https://github.com/aws-samples/aws-serverless-workshops/tree/master/WebApplication .在本次研讨会中,页面 /rides.html仅限于登录用户。如果您没有登录并尝试访问 /rides.html ,页面将开始加载,然后快速将您重定向到 /signin.html .这样做的问题是,未经授权的用户仍然可以在重定向发生前一瞬间看到游乐设施页面。

这是他们处理重定向未登录用户的代码。当用户尝试访问 /rides.html 时,它作为 javascript 运行。

   WildRydes.authToken.then(function setAuthToken(token) {
if (token) {
authToken = token;
} else {
window.location.href = '/signin.html';
}
}).catch(function handleTokenError(error) {
alert(error);
window.location.href = '/signin.html';
});

我在确定确保只有已登录的用户才能访问我网站的某些部分的最佳方式时遇到了很多麻烦。对任何与 webdev/AWS 相关的东西都非常陌生,我在网上找到这些信息时遇到了一些麻烦。

编辑:清除我想要实现的目标 - 我想要整个 rides.html任何未登录的人都无法访问该页面。

解决方案:我们最终在 s3 存储桶前面放置了一个受限的 CloudFront。然后,当有人尝试访问 CloudFront 时,我们触发了 lambda。这是一个教程:https://douglasduhaime.com/posts/s3-lambda-auth.html

最佳答案

我没有完成您提到的研讨会,但通过阅读模块 2 的自述文件,我了解到他们正在使用 Amazon Cognito 用户池实现用户身份验证和注册。

从无法访问的站点重定向很好,您不能确保它永远不会加载。让我解释一下原因:

网站上显示的“敏感”信息是非静态 .它是从模块 4 中的 REST 后端加载的。因为 身份验证是静态的 通过 JWT,如果用户未通过身份验证,则永远不会从 REST 后端加载数据。

那么页面应该是什么/rides.html做?

  • 如果用户已通过身份验证(即已获得有效的 JWT),则应调用 REST 后端以获取数据
  • 如果用户未通过身份验证(即不存在 JWT)或 JWT 存在且不再有效,则应将用户重定向到登录页面;请注意,在重定向
  • 之前,没有从 REST 后端获得任何有意义的数据。

    编辑:

    为了限制对 S3 中单个对象的访问,您可以向 s3 存储桶添加如下存储桶策略:
    {
    "Version": "2012-10-17",
    "Statement": [
    {
    "Effect": "Allow",
    "Principal": "*",
    "Action": "s3:*",
    "Resource": "arn:aws:s3:::<your-bucket-name>/*"
    },
    {
    "Effect": "Deny",
    "NotPrincipal": {
    "AWS": "<your-user-arn>"
    },
    "Action": "s3:*",
    "Resource": "arn:aws:s3:::<your-bucket-name>/rides.html"
    }
    ]
    }

    这将使所有对象公开,除了 rides.html文件。如果要访问它,则必须使用签名的 url。 [1]
    请注意,您不能将授予所有人公共(public)访问权限的存储桶或对象 ACL 与此方法结合使用,因为这可能会阻止对象保持私有(private)状态。

    另一种方法(用于使用联合用户而不是常规 IAM 用户)

    由于文档 [2] 中的限制,我不知道以下内容是否有效,但您可以尝试一下。
    可以在 NotPrincipal 属性中使用 Web 联合身份验证提供程序: "Federated": "cognito-identity.amazonaws.com" .
    然后,您可以缩小可以访问 rides.html 的联合用户的范围。通过条件键对象(例如 cognito-identity.amazonaws.com:sub)。 [3]

    [1] https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/private-content-signed-urls.html

    [2] https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_notprincipal.html

    [3] https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html

    关于javascript - AWS Cognito - 将静态 S3 网站的部分内容限制为登录用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56998548/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com