【问题标题】:Rails S3 - CloudFront 401 error triggers Basic Auth popupRails S3 - CloudFront 401 错误触发基本身份验证弹出窗口
【发布时间】:2016-10-13 01:05:28
【问题描述】:

我有一个 Rails 应用程序,其载波上传器配置为在 S3 存储桶上使用carrierwave-aws。

该存储桶的权限很糟糕,但希望我修复了它们,现在上传似乎工作正常(我检查了单个文件的权限,检查了公共读取)

Rails 应用使用 cloudfront,它已配置为处理“普通”资产(css、js 等)并使用carrierwave-aws。

但是我仍然收到 401 错误,更糟糕的是,当这种情况发生时,屏幕上会出现一个 HTTP Basic auth popu,要求输入我的分发密码

“NetworkError: 401 Unauthorized - https://xxxxxxx.cloudfront.net/uploads/user/avatar/xxxxxx/thumb_avatar.jpg

上述错误触发 HTTP 基本身份验证窗口,要求 xxx.cloudfront.net 的用户/密码

如果这是链接,事实证明我的 Rails 网站本身确实有这种身份验证(在我们开始生产之前)。

在 CloudFront 上,我配置了两个来源:我的 Rails 服务器(和 css/js 都可以,所以我猜这个很好)和 S3 存储桶(虽然不知道我如何真正测试这个)

所以

  • 如何检查我的 Rails -> Carrierwave-aws -> CloudFront 管道是否工作正常? (上传很好,上传后我无法从浏览器中读取)
  • 如果出现 401 错误,如何从网站禁用 HTTP 基本身份验证?

编辑:我在 Rails ApplicationController 中设置基本身份验证

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

【问题讨论】:

  • 您在 Apache 或其他什么地方设置了基本身份验证配置?因为我猜这是云前端问题的根本原因。
  • 嗯,是的,这是在我的 Rails ApplicationController 中完成的。但是,弹出窗口要求提供一个云端 url http 基本身份验证,即使我输入了我的 applicationcontroller 的用户/pw 凭据,它也不起作用。
  • 由于基本身份验证,云前端无法缓存来自父服务器的文件?尝试禁用身份验证,然后查看是否仍然发生。

标签: ruby-on-rails amazon-web-services amazon-s3 carrierwave amazon-cloudfront


【解决方案1】:

401 HTTP 响应当然应该触发浏览器弹出提示。如果您不希望这样,您的解决方案是在您的应用程序中不需要身份验证。

但是,此时对您最有帮助的解决方案似乎是继续并启用浏览器尝试将凭据发送回源服务器的传递。为此,CloudFront 需要将 Authorization: 标头转发到您的源。默认情况下,此请求标头(与大多数请求标头一样)被 CloudFront 丢弃并且不会发送到源。

Whitelist this header 在适当的缓存行为中,以便 CloudFront 将其转发,并且您的访问控制机制应该按预期工作。

请记住,对 CloudFront 分配的更改需要几分钟时间。等待分发返回部署状态再进行测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-09-14
    • 2015-07-20
    • 1970-01-01
    • 2020-11-25
    • 2011-08-07
    • 2018-04-18
    • 2021-10-25
    • 2020-08-28
    相关资源
    最近更新 更多