如何在Rails中调试HTTP AUTH参数?

时间:2012-01-25 12:30:55

标签: ruby-on-rails

Ruby爱好者,

我的Rails 3应用程序中出现的HTTP AUTH参数错误。密码最后有一些空格。我正在调试我的客户端应用程序,看起来它正在正确发送它。

我在我的应用中这样做:

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

然后我发送给Warden。

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

编辑:我已经调试了httpd和thin进程之间的连线,我很确定数据是否正确。它在我的Rails 3.0.10中一定是错的。我能够解码标题中的base64字符串,它不包含任何空格。

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

Qmxvb21iZXJnOnRjbG1lU1JT

解码为

Bloomberg:tclmeSRS

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

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

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

修改:事实证明我们的Apache httpd代理会在标题中添加内容:

Authorization: Basic Qmxvb21iZXJnOnRjbG1lU1JT, Basic

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

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

现在的问题是 - 这是正确的吗?它是httpd或rails中的错误吗?

1 个答案:

答案 0 :(得分:2)

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}"