Oauth2在解析base64响应时遇到问题

时间:2015-01-20 16:57:58

标签: ruby-on-rails parsing oauth-2.0

我的API(门卫)正在将base64中的PDF发送给我的客户端(Oauth2)。它无法检索base64字符串。

这是我在客户端的控制器操作(通过索引操作正常工作并显示来自API的数据没有任何问题):

def show
    if access_token
      contrat_data=access_token.get("/api/user/contrats/#{params[:id]}").parsed
      logger.debug access_token.get("/api/user/contrats/#{params[:id]}").inspect
      @contrat=Base64.decode64 contrat_data['contrat_64']
    end
  end

看来contrat_data是零。但是,调试数据如下 (我缩短了base64字符串,因为它长了几个ko):

#<OAuth2::Response:0x249fb554 
@response=#<Faraday::Response:0x249fbb6c @on_complete_callbacks=[], 
@env=#<Faraday::Env @method=:get 
@body="{\"contrat_64   \":\"JVBERi0xLjQKMSAwIG9iago8PAovVGl0bGUgKP7/KQovQ3JlYXRvciAo/v8A\\ndwBrAGgAdABtAGwAdABvA....Aw\\nMTkKJSVFT0YK\\n\"}"

@url=#<URI::HTTP:0x24a2064c URL:http://ubuntu-syl:3000/api/user/contrats/482> 
@request=#<Faraday::RequestOptions (empty)> 
@request_headers={"User-Agent"=>"Faraday v0.9.0", "Authorization"=>"Bearer 9cd25cfbb2fc2af6f2e252826195fad3b530b388fdb9b27e55fed7a1021845db"} 
@ssl=#<Faraday::SSLOptions (empty)> 
@response_headers={"content-type"=>"text/html; charset=utf-8", "transfer-encoding"=>"chunked", "connection"=>"close", "status"=>"200 OK", "x-frame-options"=>"SAMEORIGIN", "x-xss-protection"=>"1; mode=block", "x-content-type-options"=>"nosniff", "x-ua-compatible"=>"chrome=1", "cache-control"=>"max-age=0, private, must-revalidate", "x-request-id"=>"662ddbd2-9f26-4bba-8bb7-c8e79b02e8fb", "x-runtime"=>"0.396093", "x-powered-by"=>"Phusion Passenger 4.0.53", "date"=>"Tue, 20 Jan 2015 16:29:13 GMT", "server"=>"nginx/1.6.2 + Phusion Passenger 4.0.53"} 
@status=200>>, 
@options={:parse=>nil}
>

OAuth对象确实包含正文中的数据,但解析的结果为nil。应该怎么做才能检索数据?

1 个答案:

答案 0 :(得分:1)

我认为问题出在内容类型上。 OAuth将尝试为您解码响应正文(通过parsed),但不知道如何处理text/html,这是您似乎正在接收的内容。我可以在这里看到两个选项。

首先,您可以更改服务器的响应以返回不同的内容类型。 OAuth应该能够使用application/jsona few others将响应解码为JSON。

其次,您可以访问原始body并手动解码。

contrat_data_raw  = access_token.get("...")
contrat_data_json = JSON.parse(contrat_data_raw.body)
@contrat          = Base64.decode64(contrat_data_json["contrat_64"])

当然,如果json解析或Base64解码失败,你应该添加一些错误处理。