Ruby Base64.encode 结果会折行.

ichord · 2012年06月13日 · 最后由 googya 回复于 2012年10月24日 · 8482 次阅读

环境

服务端:django, oauth2app 调用端:oauth2. ruby version: 1.9.3


情景

调用 oauth 接口时,要在 HTTP 头部加入 用 Base64 编码的认证头 (HTTP_AUTHENTICATION). 下面使用了 oauth2 gem 调用接口

auth_code = Base64.encode64("Base "+client_key+":"+client_secret)

client  = client = OAuth2::Client.new(client_key, client_secret, :site => 'https://example.org')

token = client.password.get_token("username","password")

结果服务端一直报“no grant_type provided". 经过一轮前前后后,左左右有,里里外外的挖掘后.......


结果

由于 Base64.encode64 编码出来的码竟然有折行
所以 django 在解析 HTTP 头部信息时,折行认为是无效的头部信息 在该行随后的所有头部和 POST 数据都被忽略了.!!!!!!


解决。

手动去掉换行符。

其实 oauth2 使用到的 faraday gem 提供了各种认证方式的请求方法。 对于我用 password 的请求,它是这么解决的....

value = Base64.encode64([login, pass].join(':'))
value.gsub!("\n", '')

使用 Base64.strict_encode64

它会返回只有一行的 码......

这是个很坑爹的地方,按照 RFC 2616,HTTP header 里面显然不能有换行。但是,base64 很多实现是按照 RFC2045 来的,那里面规定:

The encoded output stream must be represented in lines of no more than 76 characters each.

Ruby-1.8.7 里,没有 Base64.strict_encode64 方法。

Rails 里的 ActiveSupport::Base64.encode64 会包含换行;但 ActiveSupport::Base64.encode64s 没有折行,其实就是把换行替换为空。所以某些情况下应该使用后者。

@zhangyuan 噢..... 是这样。PS. 忘记把 ruby 版本方放上去了...

@bhuztez 对对.. 就是这个.....

需要 登录 后方可回复, 如果你还没有账号请 注册新账号