Rails S3 - CloudFront 401 错误触发基本身份验证弹出窗口
Rails S3 - CloudFront 401 error triggers Basic Auth popup
我有一个 Rails 应用程序,其载波上传器配置为在 S3 存储桶上使用载波 aws。
那个桶的权限很糟糕,但希望我修复了它们,现在上传似乎工作正常(我检查了单个文件的权限,public 读取已检查)
Rails 应用程序正在使用 cloudfront,它已配置为处理 "normal" 资产(css、js 等)和 carrierwave-aws。
但是我仍然收到 401 错误,更糟糕的是,当这种情况发生时,屏幕上会出现 HTTP Basic auth popu,要求我的分发密码
"NetworkError: 401 Unauthorized - https://xxxxxxx.cloudfront.net/uploads/user/avatar/xxxxxx/thumb_avatar.jpg"
上述错误触发 HTTP 基本身份验证 windows 要求 user/pw 用于 xxx.cloudfront.net
如果这是链接,事实证明我的 Rails 网站本身确实有这种授权(在我们继续生产之前)。
在 CloudFront 上,我配置了两个来源:我的 Rails 服务器(和 css/js 没问题,所以我想这个 ons 没问题)和 S3 Bucket(不知道我怎么能虽然真的测试了这个)
所以
- 如何检查我的 Rails -> Carrierwave-aws -> CloudFront 管道是否正常工作? (上传没问题,就是上传后无法从浏览器读取)
- 如果出现 401 错误,如何从网站禁用 HTTP 基本身份验证?
编辑:我在 Rails ApplicationController
中设置了 Basic Auth
def authenticate
if ENV["HTTP_BASIC_AUTH"] == "true"
authenticate_or_request_with_http_basic do |username, password|
username == "wxx" && password == "xxx!" or
end
end
end
当然,401 HTTP 响应应该 触发浏览器pop-up 提示。如果您不希望这样,您的解决方案是不需要在您的应用程序中进行身份验证。
但是,目前对您最有帮助的解决方案似乎是继续并启用 pass-through 浏览器尝试将凭据发送回源服务器。为此,CloudFront 需要将 Authorization:
header 转发到您的来源。默认情况下,此请求 header(与大多数请求 header 一样)被 CloudFront 丢弃并且未发送到源。
Whitelist this header 适当的缓存行为,以便 CloudFront 转发它并且您的访问控制机制应该按预期工作。
请记住,对 CloudFront 分配的更改需要几分钟时间。等待分发到return到部署状态再测试。
我有一个 Rails 应用程序,其载波上传器配置为在 S3 存储桶上使用载波 aws。
那个桶的权限很糟糕,但希望我修复了它们,现在上传似乎工作正常(我检查了单个文件的权限,public 读取已检查)
Rails 应用程序正在使用 cloudfront,它已配置为处理 "normal" 资产(css、js 等)和 carrierwave-aws。
但是我仍然收到 401 错误,更糟糕的是,当这种情况发生时,屏幕上会出现 HTTP Basic auth popu,要求我的分发密码
"NetworkError: 401 Unauthorized - https://xxxxxxx.cloudfront.net/uploads/user/avatar/xxxxxx/thumb_avatar.jpg"
上述错误触发 HTTP 基本身份验证 windows 要求 user/pw 用于 xxx.cloudfront.net
如果这是链接,事实证明我的 Rails 网站本身确实有这种授权(在我们继续生产之前)。
在 CloudFront 上,我配置了两个来源:我的 Rails 服务器(和 css/js 没问题,所以我想这个 ons 没问题)和 S3 Bucket(不知道我怎么能虽然真的测试了这个)
所以
- 如何检查我的 Rails -> Carrierwave-aws -> CloudFront 管道是否正常工作? (上传没问题,就是上传后无法从浏览器读取)
- 如果出现 401 错误,如何从网站禁用 HTTP 基本身份验证?
编辑:我在 Rails ApplicationController
中设置了 Basic Authdef authenticate
if ENV["HTTP_BASIC_AUTH"] == "true"
authenticate_or_request_with_http_basic do |username, password|
username == "wxx" && password == "xxx!" or
end
end
end
当然,401 HTTP 响应应该 触发浏览器pop-up 提示。如果您不希望这样,您的解决方案是不需要在您的应用程序中进行身份验证。
但是,目前对您最有帮助的解决方案似乎是继续并启用 pass-through 浏览器尝试将凭据发送回源服务器。为此,CloudFront 需要将 Authorization:
header 转发到您的来源。默认情况下,此请求 header(与大多数请求 header 一样)被 CloudFront 丢弃并且未发送到源。
Whitelist this header 适当的缓存行为,以便 CloudFront 转发它并且您的访问控制机制应该按预期工作。
请记住,对 CloudFront 分配的更改需要几分钟时间。等待分发到return到部署状态再测试。