1

我在使用 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);
  }

任何帮助,将不胜感激。

4

1 回答 1

0

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

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

您的授权标头也不正确。HTTP 基本身份验证要求您对用户名和密码进行 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()
于 2021-10-07T22:44:56.263 回答