Spotify令牌后呼叫返回错误网站,而不是错误或令牌

时间:2017-07-06 08:42:22

标签: angular http-post authorization spotify

我正在尝试使用授权代码流而不是我目前使用的隐式授权。 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。

1 个答案:

答案 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。