我需要从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”,“accept”=>“/;q=0.5,application/json”,“accept encoding”=>“gzip,deflate”,“authorization”=>“基本y2nmnti3odvlzwi1ndvlodk0zmm2zty3ytzhndm0zda6ytq5mjdlogfmowqy\nnge0otgyzdrkodi1Mmjhzjbknti=\n”
我得到
=>400 badrequest应用程序/json 131字节
这似乎是一个很糟糕的请求,因为我看不到任何grant_type => client_credentials的迹象。文档中说这是mandadory作为请求主体参数。
我相信我发错了,但我不知道如何正确处理。
我尝试使用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::不支持dmediatype:
415不支持的媒体类型
如何使用RestClientgem发送请求正文参数?

最佳答案

问题在于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}")

关于ruby-on-rails - Spotify Web API:基本授权,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42515314/

10-13 03:39