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 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到部署状态再测试。