【问题标题】:Error 400 when making POST request to Spotify API with Axios on Express.js在 Express.js 上使用 Axios 向 Spotify API 发出 POST 请求时出现错误 400
【发布时间】:2019-08-22 22:47:50
【问题描述】:

在 Express 后端服务器上使用 axios 发出发布请求时,我试图从 Spotify API 检索访问令牌。到目前为止,我一直没有成功。我收到以下错误:

数据: {错误:'unsupported_grant_type', 错误描述: 'grant_type 必须是 client_credentials、authorization_code 或 refresh_token' } } }

我已经尝试将“grant_type”的“data”属性更改为“params”,但仍然无法正常工作。任何建议都会有所帮助。

const express = require('express');
const axios = require('axios');
const dotenv = require('dotenv');
dotenv.config();
const app = express();
const port = 3000;

const client_id = process.env.CLIENT_ID;
const client_secret = process.env.CLIENT_SECRET;

app.get('/spotify-authorization', (req, res) => {
  axios({
    method: 'post',
    url: 'https://accounts.spotify.com/api/token',
    data: {
      grant_type: 'client_credentials'
    },
    headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
      Authorization:
        'Basic ' +
        Buffer.from(client_id + ':' + client_secret).toString('base64')
    }
  })
    .then(response => {
      console.log(response.data);
    })
    .catch(error => {
      console.log(error);
    });

  res.send('successful response received!');
});

app.listen(port, () => console.log(`Express app listening on port ${port}!`));

我希望能够在 Spotify API 的响应中检索访问令牌。请帮忙!

【问题讨论】:

  • 我已经尝试过使用“param”和“params”,但不幸的是收到了同样的错误。
  • 来自文档:grant_type Required. As defined in the OAuth 2.0 specification, this field must contain the value "authorization_code".grant_type: 'client_credentials' 更改为 grant_type: "authorization_code"
  • 根据 Spotify API 文档上的客户端凭据流程,grant_type 必须是“client_credentials”。
  • 是的,这就是链接。我正在查看客户端凭据流。

标签: node.js express axios


【解决方案1】:

来自axios 文档:By default, axios serializes JavaScript objects to JSON. To send data in the application/x-www-form-urlencoded format instead, you can use one of the following options.

对于 Nodejs,您可以使用 querystring 模块,如下所示:

var querystring = require('querystring');
axios.post('http://something.com/', querystring.stringify({ foo: 'bar' }));

所以,你可以试试data: querystring.stringify({ grant_type: 'client_credentials' })

【讨论】:

  • 我试过了,但我现在收到 400 错误并显示以下消息:data: { error: 'invalid_client', error_description: 'Invalid client' } } }
  • 听起来像是身份验证问题,您可以尝试使用Postman 并检查响应代码是401 还是403(使用node 转换为base64,或者您可以在线进行)
  • 所以我尝试了 Postman 并得到了成功的响应(200)。然后,我将 Postman 自己的 base64 编码授权标头版本复制到我的 express.js 文件中的 post 请求中,并且它起作用了。所以这让我相信环境变量有问题。原来我将 .env 文件存储在服务器文件上方的目录中,这阻止了它加载相同的变量。一旦我将它们移到同一目录中,请求就起作用了。非常感谢您的帮助!
【解决方案2】:

由于声誉低,我无法发表评论,但 1556089774 的答案应该是公认的答案。自从 Spotify 的 iOS sdk 指向 https://glitch.com/~spotify-token-swap 作为一个不起作用的例子以来,我花了 4 个多小时研究它为什么不起作用。将 stringify 添加到请求的数据部分使其工作:

data: querystring.stringify ({
  grant_type: "authorization_code",
  redirect_uri: SPOTIFY_CLIENT_CALLBACK_URL,
  code: authorization_code
})

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 2022-01-10
    • 1970-01-01
    • 2020-10-26
    • 2021-12-21
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2014-12-04
    相关资源
    最近更新 更多