【问题标题】:How to fix 'invalid_client' error with Oauth 2.0 in node.js如何在 node.js 中使用 Oauth 2.0 修复“invalid_client”错误
【发布时间】:2021-02-16 22:00:46
【问题描述】:

我正在尝试使用 Oauth 2.0 访问 Bexio API。我正在尝试在 node.js 服务器上实现这一点。第一步(获取访问代码)正在工作,我的回调方法已执行。但是,获取访问令牌总是失败。当我发出一个获取访问令牌的发布请求时,我总是收到一个“invalid_client”错误,描述为“在标头或正文中找不到客户端凭据”。

我有一个客户端 ID 和密码,并且我设法使用邮递员获取了访问令牌,所以显然错误在我的代码中。有人建议我需要对请求的正文进行编码(并且在客户端密码中可能有 '=' 之类的内容),但我找不到太多相关信息。

这是我的代码:

let redirect_uri =
  process.env.REDIRECT_URI ||
  'http://localhost:8888/callback'

app.get('/login', function(req, res) {
  res.redirect('https://office.bexio.com/oauth/authorize?' +
    querystring.stringify({
      response_type: 'code',
      client_id: CLIENT_ID,
      scope: 'contact_edit monitoring_show',
      state: 'abc',
      redirect_uri
    }))
})

app.get('/callback', async (req, res) => {
  const code = req.query.code
  axios.post('https://office.bexio.com/oauth/access_token', {

      grant_type: 'authorization_code',
      code: code,
      redirect_uri: redirect_uri,
      client_id: CLIENT_ID,
      client_secret: CLIENT_SECRET
  })
  .then(response => {
    console.log(response)
  })
  .catch(error =>{
    console.log(error)
  })
});

这是http请求:

 { url: 'https://office.bexio.com/oauth/access_token',
     method: 'post',
     data:
 '{"grant_type":"authorization_code",
"code":CODE,
"redirect_uri":"http://localhost:8888/callback",
"client_id":CLIENT_ID,
"client_secret":CLIENT_SECRET}',
     headers:
      { Accept: 'application/json, text/plain, */*',
        'Content-Type': 'application/json;charset=utf-8',
        'User-Agent': 'axios/0.19.0',
        'Content-Length': 265 }

我需要一个访问令牌,但我总是收到一个“invalid_client”错误,描述为“在标头或正文中找不到客户端凭据”

【问题讨论】:

    标签: node.js oauth bexio


    【解决方案1】:

    您必须以application/x-www-form-urlencoded 格式将数据发送到 OAuth2 令牌端点。 Axios 默认为application/json。您可以在此处查看使用该格式的文档:https://github.com/axios/axios#using-applicationx-www-form-urlencoded-format。在你的情况下,它会这样做:

    const params = new URLSearchParams();
    params.append('grant_type', 'authorization_code');
    params.append('code', code);
    params.append('redirect_uri', redirect_uri);
    params.append('client_id', CLIENT_ID);
    params.append('client_secret', CLIENT_SECRET);
    
    axios.post('https://office.bexio.com/oauth/access_token', params)
    

    【讨论】:

    • 非常感谢,这解决了问题。
    猜你喜欢
    • 1970-01-01
    • 2019-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多