【问题标题】:Reddit API - Requesting Access Token using JavaScriptReddit API - 使用 JavaScript 请求访问令牌
【发布时间】:2021-11-27 23:19:06
【问题描述】:

我在使用 Reddit API 检索访问令牌的 POST 请求格式方面遇到问题。我遵循OAuth2 的说明,并且能够在用户授予权限后解析初始“代码”的 URL,但我不知道在发布请求中确切包含什么。这是我目前所拥有的,其中 returnCode 是从 URL 解析的代码,但我得到了 401 响应。

async function fetchToken(returnCode) {

    const form = new FormData();
    form.set('grant_type', 'authorization_code');
    form.set('code', returnCode);
    form.set('redirect_uri', 'http://localhost:3000/')

    const response = await fetch('https://www.reddit.com/api/v1/access_token', {
      method: 'POST',
      mode: 'no-cors',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        authorization: `Basic clientID + clientSecret`
      },
      body: form
    }).then(r => r.json())
    console.log(response);
  }

任何帮助将不胜感激。

【问题讨论】:

  • 你是从 Node 还是从浏览器运行它?你为什么用mode: "no-cors"

标签: javascript node.js fetch-api x-www-form-urlencoded


【解决方案1】:

您正在传递 FormData 请求正文,其内容类型为 multipart/form-data,而不是必需的 application/x-www-form-urlencoded。尝试改用URLSearchParams...

const form = new URLSearchParams({
  grant_type: "authorization_code",
  code: returnCode,
  redirect_uri: "http://localhost:3000/"
})

您的 authorization 标头也不正确。 HTTP Basic 身份验证要求您对用户名和密码进行 base64 编码

const credentials = Buffer.from(`${clientID}:${clientSecret}`).toString("base64")

const res = await fetch('https://www.reddit.com/api/v1/access_token', { 
  method: "POST",
  headers: {
    Authorization: `Basic ${credentials}`
  },
  body: form
})
if (!res.ok) throw new Error(`${res.status}: ${await res.text()}`)
return res.json()

【讨论】:

  • 我正在使用 Node.js。我进行了更改,但我得到了 401-未经授权。我很确定 id、secret 和代码是正确的,但我会再次检查所有内容。感谢您提供有关 formData 的提示,我使用了一些我发现但不知道的拼凑代码。
  • @Adam 我错过了标题中的“基本”关键字。现已修复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 2020-05-05
  • 2013-02-17
  • 2019-03-23
  • 2018-08-22
  • 1970-01-01
相关资源
最近更新 更多