axios returns 进行基本身份验证时的响应代码为 400

Axios returns a response code of 400 when making Basic Authentication

我正在尝试使用 basic authentication 流程从邮递员中的 api 端点获取访问令牌。

app.post('/epic', async (req:Request, res) => {
  const code = req.query.code as string
  const url = "https://api.epicgames.dev/epic/oauth/v1/token"
  const values = new URLSearchParams({
    code,
    client_id,
    client_secret,
    scope: "basic_profile",
    grant_type: "authorization_code",
  })

  console.log(code, values)

  try {
    const res = await axios.post(url, values, {
      headers: {
        "Content-Type": "application/x-www-form-urlencoded",
      },
    })
    console.log(res.data)
    return res.data
  } catch (error: any) {
    console.error(error.message)
    throw new Error(error.message)
  }
})

它一直返回 400 错误请求。我做错了什么吗?

UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch()

req.query 为您提供 URL 中的查询参数(例如 https://www.somewebsite.com/api?code=supersecretcode),而在邮递员中,您将其作为请求的正文提供。您可以通过两种方式解决此问题:

  1. 在 URL 中使用查询参数,而不是在邮递员请求的正文中 - 这就像将请求正文中的所有内容移动到 URL 一样简单( http://localhost:4000/epic?code=supersecretcode&grant_type=authorization_code&scope=basic_profile)

  2. 在您的服务器中解析请求正文。我在这个例子中使用了有用的 body-parser 包:

const bodyParser = require("body-parser")

app.use(bodyParser.urlencoded({ extended: false })

app.post('/epic', async (req: Request, res) => {
  const { code } = req.body
  const url = "https://api.epicgames.dev/epic/oauth/v1/token"
  const values = new URLSearchParams({
    code,
    client_id,
    client_secret,
    scope: "basic_profile",
    grant_type: "authorization_code",
  })
  // ...
})