下面是https://github.com/reddit-archive/reddit/wiki/oauth2文档,我一直在尝试获取访问令牌失败,并且不知道为什么。
我从POST请求中收到以下401(未授权)响应:
{
"headers": {
"normalizedNames": {},
"lazyUpdate": null
}
,
"status":401,
"statusText":"Unauthorized",
"url":"https://www.reddit.com/api/v1/access_token",
"ok":false,
"name":"HttpErrorResponse",
"message":"Http failure response for https://www.reddit.com/api/v1/access_token: 401 Unauthorized",
"error": {
"message": "Unauthorized", "error": 401
}
}
我再次检查了我的clientId,clientSecret,redirect_uri和代码是否都应该是它们的全部。我还检查了btoa
函数是否生成了我期望的结果。我尝试使用没有'User-Agent'和'Content-Type'键的标头,无论是否使用它,都无法使用。
这是我在做什么:
getAccessToken() {
const httpOptions = {
headers: new HttpHeaders({
'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0',
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': 'Basic ' + btoa(myClientId + ':' + myClientSecret)
})
}
const postData = {
grant_type: 'authorization_code',
code: myCode,
redirect_uri: 'http://localhost:4200',
};
return this.http.post('https://www.reddit.com/api/v1/access_token', postData, httpOptions )
}
非常感谢您的帮助,我在此问题上停留的时间太长了。
答案 0 :(得分:1)
您的User-Agent
字符串不安全,将被Reddit服务器拒绝。删除它-它会自动为您处理。
确保您的重定向URI与您在postData
中拥有的重定向URI完全匹配。忘记URI末尾的/
斜杠或将http
与https
混在一起很容易,如果您的应用程序配置中有一组,则授予无效。
grant_type
应该作为字符串而不是Object
传递。 我可以使用以下功能从其API获得有效的响应:
getAccessToken() {
const httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/x-www-form-urlencoded',
'Authorization': 'Basic ' + btoa(myClientId + ':' + myClientSecret),
}),
};
const grantType = 'authorization_code';
const code = myCode;
const redirectUri = 'http://localhost:4200/';
const postdata = `grant_type=${grantType}&code=${code}&redirect_uri=${redirectUri}`;
return this.http.post('https://www.reddit.com/api/v1/access_token', postdata, httpOptions);
}
最后一点-通过将console.log
服务调用的结果放在getAccessToken()
中,调试起来相对容易。当我在现有的Angular应用程序之一中执行代码时,它提供了更清晰的错误消息:
this.redditService
.getAccessToken()
.subscribe(response => console.log(response));
// Output: { error: "unsupported_grant_type" }