[英]Authorization Issues on S3 Hosted Static Site
我已经配置了基于 cognito 的身份验证,一切都在我的本地机器上运行,但是当我将编译的 nuxt 应用程序推送到 S3 时,登录后出现以下错误:
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>YJ5VBAF69BFHNTRA</RequestId>
<HostId>+ROpBRvEbtrVxTgwqSfhDvK5jwhCfbD9eoE3X6RslkFghQXDL+NwkupIqXoYW2Em9ZoBEhP31Oo=</HostId>
</Error>
这似乎是一个 s3 错误,我不确定是什么原因导致的,因为该网站在其他方面表现正常。
可以通过注册并尝试登录网站 (copyswapper.com) 来重复。
这是提供默认文档 (index.html) 的问题 - 下面的修复说明。
地方发展
在您的本地计算机上,开发 web 服务器,例如 webpack 服务index.html
,无论用户在 vue.js 应用程序中浏览的路径如何:
AWS
我看到您正在将 static 个文件部署到 S3,然后通过 Cloudfront 为它们提供服务。 但默认文档处理方式不同,这意味着此路径不提供index.html
文件,而是导致错误:
权限
我有一个以相同方式托管的演示单页应用程序,您可以从该页面运行以进行比较。 标准设置是只允许 Cloudfront 通过这样的权限访问文件。 如果文件丢失,则会导致上述错误:
{
"Version": "2008-10-17",
"Id": "PolicyForPublicWebsiteContent",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity H1D9C6K7CY211F"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::web.authsamples.com/*"
}
]
}
问题 1:违约文件处理
您需要提供 lambda 边缘 function 来提供默认文档,无论用户在单页应用程序中的路径如何:
这是我的演示 SPA 的几个路径。 请注意,其中第一个可能是应用程序中的路径,因此默认文档处理会处理它。 第二个结果是一个不存在的 Javascript 文件,我没有尝试修复它,所以它会导致你得到同样的错误:
问题 2:安全标头
当你在那里时,你还应该写一个 lambda edge function 来使用推荐的安全标头,类似于:
如果您随后浏览到Mozilla Observatory并输入您的站点名称,您将获得更好的安全评级,就像我的演示应用程序一样:
LAMBDA 边缘测试和部署
lambda 边缘功能可以在一个小的子项目中进行管理,如我的示例所示。 我使用 Serverless 框架,这意味着逻辑在Serverless.yml 文件中表达,然后我在开发过程中运行这些命令来测试逻辑:
npm install
npm run defaultDocument
npm run securityHeaders
然后我使用这些命令部署代码:
npm run package
npm run deploy
概括
单页应用程序不是 100% static,需要一些代码来处理上面提到的两个问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.