我需要从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不支持的媒体类型
如何使用
RestClient
gem发送请求正文参数? 最佳答案
问题在于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/