获取Reddit API的OAuth令牌时,不支持的授权类型

时间:2018-04-08 16:51:17

标签: javascript api oauth-2.0 reddit

我正在尝试在Application Only OAuth instructions之后获取Reddit API的OAuth令牌。我的reddit应用是一个已安装的应用,因此对于grant_type,我正在使用https://oauth.reddit.com/grants/installed_client

目前,我正在运行一个非常简短的JS脚本来查询API并获取令牌:

const APP_ID = 'MY_APP_ID'
const DEVICE_ID = 'TRACKING_ID_20_TO_30_CHARS'


let form = new FormData()
form.append('grant_type', 'https://oauth.reddit.com/grants/installed_client')
form.append('device_id', DEVICE_ID)

fetch('https://www.reddit.com/api/v1/access_token', {
   method: 'POST',
   headers: new Headers({
     'Content-Type': 'application/x-www-form-urlencoded',
     'Authorization': `Basic ${btoa(`${APP_ID}:`)}`,
   }),
   body: form })
  .then(handleResponse)
  .then(function(data) {
console.log(data)
  })
  .catch(error => console.error(error))

function handleResponse(response) {
  return response.json()
}

(注意:按原样运行代码段将为您提供NetworkError,因为APP_ID不是真实的,我不想放弃。)

我得到的回应是:

{
  "error": "unsupported_grant_type"
}

当我使用REST客户端尝试相同的API请求时,我得到了预期的响应,因此这让我觉得问题与JavaScript有关。由于grant_type符合说明所说的,我不确定如何处理错误。我希望有其他更有经验的OAuth会知道这里发生了什么。

1 个答案:

答案 0 :(得分:0)

问题在于使用FormData对象。在故障排除的早期阶段,我在Reddit上找到this answer并决定使用它,但这对我没用。

它提交的数据为multipart/form-data而不是application/x-www-form-urlencoded,Reddit的OAuth服务器不喜欢这些数据。我写了一个基于this answer的辅助函数,它完成了这个诀窍:

function urlEncode(data) {
  let out = [];

  for (let key in data) {
    out.push(`${key}=${encodeURIComponent(data[key])}`);
  }

  return out.join('&')
}