无法使用HTTP基本身份验证,401故障响应检索Reddit OAuth2访问令牌

时间:2019-07-07 17:02:02

标签: angular reddit

下面是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 )
}

非常感谢您的帮助,我在此问题上停留的时间太长了。

1 个答案:

答案 0 :(得分:1)

  1. 您的User-Agent字符串不安全,将被Reddit服务器拒绝。删除它-它会自动为您处理。

  2. 确保您的重定向URI与您在postData中拥有的重定向URI完全匹配。忘记URI末尾的/斜杠或将httphttps混在一起很容易,如果您的应用程序配置中有一组,则授予无效。

successful app setup

  1. 您的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);
}

valid response data

最后一点-通过将console.log服务调用的结果放在getAccessToken()中,调试起来相对容易。当我在现有的Angular应用程序之一中执行代码时,它提供了更清晰的错误消息:

this.redditService
  .getAccessToken()
  .subscribe(response => console.log(response));

// Output: { error: "unsupported_grant_type" }