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中的错误吗?
答案 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}"