Rails S3 - CloudFront 401错误触发Basic Auth弹出窗口

时间:2016-06-12 15:07:49

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

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

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

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用户/ pw

如果这是相关的,事实证明我确实在我的Rails网站上有这种认证(在我们进入制作之前)。

在CloudFront上,我配置了两个来源:我的Rails服务器(和css / js都可以,所以我猜这个很好)和S3 Bucket(不知道我怎么能真正测试这个)

所以

  • 如何查看我的Rails - > Carrierwave-aws - > CloudFront管道工作正常吗? (上传很好,上传后我无法从浏览器中读取)
  • 如果出现401错误,如何从网站禁用HTTP Basic Auth?

编辑:我在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

1 个答案:

答案 0 :(得分:1)

401 HTTP响应当然是假设来触发浏览器弹出提示。如果您不希望这样,您的解决方案就不需要在您的应用程序中使用auth。

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

Whitelist this header在相应的缓存行为中,以便CloudFront转发它,您的访问控制机制应该按预期工作。

请记住,对CloudFront分配的更改需要几分钟时间。等待测试之前返回到已部署状态。