我需要从 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发送请求正文参数?
答案 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非常容易。