【问题标题】:How to debug HTTP AUTH params in Rails?如何在 Rails 中调试 HTTP AUTH 参数?
【发布时间】:2012-01-25 21:42:04
【问题描述】:

Ruby 主义者,

进入 Rails 3 应用程序的 HTTP AUTH 参数有问题。密码末尾有一些空格。我正在调试我的客户端应用程序,它看起来发送正确。

我在我的应用程序中这样做:

params[:auth_username], params[:auth_password] = user_name_and_password(request)

然后我将这个发送给 Warden。

我想查看原始数据,看看是否有空格。该怎么做?

编辑:我已经调试了 httpd 和瘦进程之间的线路,我很确定数据正确无误。我的 Rails 3.0.10 一定有问题。我能够解码标题中出现的 base64 字符串,它不包含任何空格。

这看起来确实像 BASE64 解码器问题。也许是填充问题。我的字符串是:

Qmxvb21iZXJnOnRjbG1lU1JT

解码为

Bloomberg:tclmeSRS

正确使用非 Ruby base64 解码器。即使在 Ruby 中:

>> Base64.decode64 "Qmxvb21iZXJnOnRjbG1lU1JT"
=> "Bloomberg:tclmeSRS"

我不明白。在 Rails 中搜索错误报告或类似的东西。

编辑:事实证明我们的 Apache httpd 代理在标头中添加了一些内容:

Authorization: Basic Qmxvb21iZXJnOnRjbG1lU1JT, Basic

这会导致密码末尾的字符不正确,因为:

>> Base64.decode64('Basic Qmxvb21iZXJnOnRjbG1lU1JT, Basic'.split(' ', 2).last || '')
=> "Bloomberg:tclmeSRS\005\253\""

现在的问题是 - 正确吗?是 httpd 还是 rails 的 bug?

【问题讨论】:

  • 似乎问题出在您的 httpd 配置上。 , Basic 对我来说听起来很奇怪。
  • 是我们的 apache httpd 配置中的一个错误:RequestHeader append Authorization "Basic" early

标签: ruby-on-rails


【解决方案1】:

Rails user_name_and_password 方法调用 decode_credentials 执行以下操作,然后使用 ":" 进行拆分:

::Base64.decode64(request.authorization.split(' ', 2).last || '')

应用于您的数据:

::Base64.decode64("Qmxvb21iZXJnOnRjbG1lU1JT".split(' ', 2).last || '').split(/:/, 2)
=> ["Bloomberg", "tclmeSRS"]

一切似乎都很好,问题出在 IMO 的其他地方。从您的控制器转储授权数据:

render :text => "Authorization: #{request.authorization}"

【讨论】:

    猜你喜欢
    • 2019-04-04
    • 2014-08-28
    • 2020-07-25
    • 2016-08-23
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    相关资源
    最近更新 更多