Spotify Web API:基本授权

时间:2017-02-28 17:36:01

标签: ruby-on-rails ruby http httprequest rest-client

我需要从 Spotify Web API 获取访问令牌。基于this documentation我写了以下方法:

def authorize
  grant = Base64.encode64("#{SPOTIFY_KEY}:#{SPOTIFY_SECRET}")
  RestClient::Request.execute(
    method: :post,
    url: 'https://accounts.spotify.com/api/token',
    params: {'grant_type' => 'client_credentials'},
    headers: {"Authorization" => "Basic #{grant}","Accept" => "*/*; q=0.5, application/json"}
  )
end

以及以下RSpec测试:

it 'authorize' do
  obj = SpotifyIntegration.new
  response = obj.authorize
  myjson = JSON.parse(response.body)
  expect(myjson.has_key?('access_token')).to be(true)
  expect(myjson.has_key?('token_type')).to be(true)
  expect(myjson['token_type']).to eq('bearer')
  expect(myjson.has_key?('expires_in')).to be(true)
end

当我运行此测试时,生成此请求(使用RESTCLIENT_LOG = stdout捕获)

  

RestClient.post“https://accounts.spotify.com/api/token”,“接受”=>“ / ; q = 0.5,application / json”,“Accept-Encoding”=>“gzip, deflate“,”授权“=>”基本Y2NmNTI3ODVlZWI1NDVlODk0ZmM2ZTY3YTZhNDM0ZDA6YTQ5MjdlOGFmOWQy \ nNGE0OTgyZDRkODI1MmJhZjBkNTI = \ n“

我得到了

  

=> 400 BadRequest | application / json 131 bytes

这似乎是一个非常糟糕的请求,因为我看不到grant_type => client_credentials的迹象。文件说明这是一个mandodory 作为请求主体参数

我相信我发错的方式,但我不知道如何正确地发送它。

我尝试使用RestClient#post代替RestClient::Request#execute,执行此操作:

def authorize
  grant = Base64.encode64("#{SPOTIFY_KEY}:#{SPOTIFY_SECRET}")
  RestClient.post 'https://accounts.spotify.com/api/token', {'grant_type' => 'client_credentials'}.to_json, {"Authentication" => "Basic #{grant}",content_type: :json, accept: :json}
end

然后我得到了:

  

RESTClient实现:: UnsupportedMediaType:          415不支持的媒体类型

如何使用RestClient gem发送请求正文参数?

2 个答案:

答案 0 :(得分:3)

问题在于Base64对字符串进行编码的方式,其中包括大多数OAuth2提供商不接受的换行符。你可以这样做:

grant = Base64.encode64("#{client_id}:#{client_secret}").delete("\n")

resp = RestClient.post('https://accounts.spotify.com/api/token',
                       {'grant_type' => 'client_credentials'},
                       {"Authorization" => "Basic #{grant}"})

根据this回答,每60个字符添加新行(这对我来说是新闻)。您可以使用不包含换行符的其他方法,例如strict_encode ...

grant = Base64.strict_encode64("#{client_id}:#{client_secret}")

答案 1 :(得分:1)

这不是您正在寻找的答案,但您应该明确地看一下这个Ruby库:Updated Example。使用Spotify Oauthentication非常容易。