Ruby Base64.encode 结果会折行.

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

环境

服务端: 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

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

共收到 5 条回复

这是个很坑爹的地方,按照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 对对.. 就是这个.....

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