Невозможно получить токен доступа Reddit OAuth2 с помощью HTTP Basic Auth, ответ об ошибке 401 - PullRequest
1 голос
/ 07 июля 2019

Следуя документации здесь: https://github.com/reddit-archive/reddit/wiki/oauth2, Мне не удалось получить токен доступа, и я не могу понять, почему.

Я получаю следующий 401 (неавторизованный) ответ на мой запрос POST:

{
  "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 Ответ

1 голос
/ 07 июля 2019
  1. Ваша строка User-Agent небезопасна и будет отклонена серверами Reddit.Удалите это - оно будет автоматически обработано для вас.

  2. Убедитесь, что ваш URI перенаправления точно совпадает с URI перенаправления, который есть в вашем postData.Может быть легко забыть завершающий слеш / в конце вашего URI или смешать http с https, что сделает ваш грант недействительным, если у вас есть один набор в конфигурации вашего приложения.

successful app setup

Ваш 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

Asпоследнее замечание - отладка была сравнительно простой, поместив console.log в результате вызова службы getAccessToken().Это предоставило более четкое сообщение об ошибке, когда я выполнил ваш код в одном из моих существующих приложений Angular:

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

// Output: { error: "unsupported_grant_type" }
...