我正在尝试使用授权代码流而不是我目前使用的隐式授权。 Here是两种流量的文档。我正在使用Angular 2应用程序中的spotify API。前三个步骤顺利,我从回调调用中获取代码。但是当我对https://accounts.spotify.com/api/token进行调用时,我得到了CORS异常,因为调用返回了浏览器禁止的网站。返回页面与点击此链接https://accounts.spotify.com/api/token相同。我尝试使用curl来调用这个API,这是我注意到的。 在打电话时:
curl -H "Authorization: Basic ZjM...zE=" -d grant_type=authorization_code -d code=MQCbtKe...44KN -d redirect_uri=https%3A%2F%2Fwww.foo.com%2Fauth https://accounts.spotify.com/api/token
它返回错误json消息并抱怨无效客户端。
当我删除数据时,它会返回错误的html页面。
curl -H "Authorization: Basic ZjM...zE=" https://accounts.spotify.com/api/token
所以我假设在我的代码中问题是相同或类似的。那么可以将这些参数设置为POST调用体吗?似乎spotify端点根本没有获取我的参数,这就是它不返回错误消息的原因。 Here是spotify提供的示例,此处here是Angular http组件的文档。
这是我的TypeScript调用:
var data = {
redirect_uri: this.config.redirectUri,
grant_type: 'authorization_code',
code : code
};
let headers = this.getTokenHeaders();
let address = "https://accounts.spotify.com/api/token";
return this.http.post(address,data, new RequestOptions({headers: headers}))
.toPromise()
.then(res =>
{
let body = res.json();
localStorage.setItem('spotify-access-token', body.access_token);
localStorage.setItem('spotify-refresh-token', body.refresh_token);
var expiresIn = body.expires_in;
return true;
})
.catch(err=>
{
return false;
});
getTokenHeaders()
{
return new Headers(this.accountAuth());
}
private accountAuth(): Object {
var auth = {
'Authorization': 'Basic ' + (new Buffer(this.config.clientId + ':' + this.config.clientSecret).toString('base64')),
'Content-Type': 'application/x-www-form-urlencoded'
//'Content-Type':'application/json'
};
return auth;
}
我尝试将Content-Type设置为application / json和application / x-www-form-urlencoded。
答案 0 :(得分:0)
我找到了这个答案https://stackoverflow.com/a/28406268/8081009,并在服务器端尝试了它,并且当我使用邮件正文传递参数时也得到了相同的错误页面。然后我将参数更改为url,如下所示:
var url = "/api/token?redirect_uri=http://localhost:8080/callback.html&grant_type=authorization_code&code="+code;
现在我收到了正确的信息。希望这有助于某人。
所以不要在客户端使用api / token并将参数设置为url。