当前位置: 首页 > 知识库问答 >
问题:

Spotify API客户端凭据流返回400错误

萧献
2023-03-14

在此处为客户端凭据流使用Spotify文档:

我能够在谷歌应用程序脚本(Javascript)中创建API请求。

  function callAPI () {

    SPOTIFY_CLIENT_SECRET = secret
    SPOTIFY_CLIENT_ID = id

    const HEADERS = {
      "Content-Type": "application/json",
      'Authorization': `Basic ${Utilities.base64Encode(SPOTIFY_CLIENT_ID + ':' + SPOTIFY_CLIENT_SECRET)})`
      }
    
    const BODY = {
      'grant_type': 'client_credentials'
      }
    
    var url = `https://api.spotify.com/api/token`

    var requestOptions = {
      'method': 'POST',
      'headers': HEADERS,
      'payload': JSON.stringify(BODY),
      'muteHttpExceptions': true,
      'redirect': 'follow'
      };

    var response = UrlFetchApp.fetch(url, requestOptions);
    var data = JSON.parse(response.getContentText());

我对两件事感到困惑,请能够回答这两件事。

1). Spotify文档声明在授权标头中的客户端凭据之前输入“Basic”。

然而,当我运行这段代码时,我得到了这个错误

{ error: 
   { status: 400,
     message: 'Only valid bearer authentication supported' } }

如果我在使用客户端凭据流,为什么它认为我在使用承载令牌?(同样,如果我将身份验证更改为Bearer,我会收到401错误“无效访问令牌”)

2)。您能否提供此代码的工作版本的示例,以及为什么它能够与我的代码相反运行?

共有2个答案

符功
2023-03-14

我想出来了!出于某种原因,您需要在表单数据中添加客户端id和客户端机密。Spotify文档表示要将它们放在标题base64编码中,但在本例中并非如此。(你甚至不需要对它们进行编码)

此外,您甚至不需要像文档中所说的那样包含content-type参数。

工作代码如下所示

js lang-js prettyprint-override">  function callAPI () {
    let SPOTIFY_CLIENT_SECRET = secret
    let SPOTIFY_CLIENT_ID = id

  const BODY = {
    'Content-Type': 'application/x-www-form-urlencoded',
    'grant_type': 'client_credentials',
    "client_id": SPOTIFY_CLIENT_ID,
    "client_secret": SPOTIFY_CLIENT_SECRET,
  }

  var url = "https://accounts.spotify.com/api/token";
  
  var requestOptions = {
    'method': 'POST',
    'payload': BODY,
    'muteHttpExceptions': true,
  };

  var response = UrlFetchApp.fetch(url, requestOptions);
  var data = response.getContentText();
  console.log(data)

  }
勾安翔
2023-03-14

我相信你的目标如下。

>

  • 您希望将以下curl命令转换为Google Apps脚本。

      curl -X "POST" -H "Authorization: Basic ZjM4ZjAw...WY0MzE=" -d grant_type=client_credentials https://accounts.spotify.com/api/token
    

    在这种情况下,grant\u type=client\u凭据作为表单数据发送。当我看到你的脚本时,它被作为数据发送。您使用的URL为https://api.spotify.com/api/token。但是curl命令使用https://accounts.spotify.com/api/token`我认为这可能是你的问题的原因。因此,当您的脚本被修改时,它将变成如下所示。

    function callAPI() {
      SPOTIFY_CLIENT_SECRET = secret; // Please set your value.
      SPOTIFY_CLIENT_ID = id; // Please set your value.
      const HEADERS = {
        'Authorization': `Basic ${Utilities.base64Encode(SPOTIFY_CLIENT_ID + ':' + SPOTIFY_CLIENT_SECRET)}` // Modified
      }
      const BODY = {
        'grant_type': 'client_credentials'
      }
      var url = "https://accounts.spotify.com/api/token";
      var requestOptions = {
        'method': 'POST',
        'headers': HEADERS,
        'payload': BODY,
        'muteHttpExceptions': true,
      };
      var response = UrlFetchApp.fetch(url, requestOptions);
      var data = response.getContentText();
      console.log(data)
    }
    
    • 当我再次看到您的脚本时,我注意到需要修改Basic${Utilities.base64Encode(SPOTIFY\u CLIENT\u ID':'SPOTIFY\u CLIENT\u SECRET)。因为在这种情况下,它是基本的。请删除
    • 客户端凭据流
    • 获取(url, params)

  •  类似资料:
    • 我正在尝试对客户端凭据流进行身份验证,但一直返回错误400。我查看了可用的API,但看不出我做错了什么。如果有人能给我一个正确的方向,那太棒了。谢谢

    • 我的服务器上再次收到错误。 { “错误”: “invalid_client” } 我已经编码到base64并将域列入了白名单,但仍然得到相同的错误。我会感激任何帮助,这让我发疯了,哈哈。

    • 我已经考虑这个问题好几天了,从经验中我知道我通常会解决这些问题,但这次我遇到了砖墙。 我有一个在Azure DevOps YAML管道中实例化的python应用程序。该应用程序调用Azure DevOps REST API来创建存储库 该应用程序使用PAT(个人访问令牌)进行身份验证 我在Azure DevOps中创建了一个应用程序: 我的计划是让这一切都在Postman中工作,然后将我的发现移植

    • 如果可能的话请告诉我。另外,我想传达的是Keycloak和openid-connect协议是全新的。

    • 直截了当的问题,希望有一个直截了当的答案。我试图使用request通过Node.js实现客户端凭证流。这是我的代码 无论我做什么,响应体总是 我尝试过使用 curl 提出请求,结果相同。 这意味着这是凭据的问题。我肯定为我的应用程序使用了正确的客户端ID和客户端秘密,这让我相信是编码导致了问题。 我的编码正确吗?如果是这样,还有什么原因呢?

    • 在后端,我进行了调试,并收到了请求,它根据客户机上设置的令牌查找用户,但随后什么也不做,只在我试图从应用程序发送时返回给我400,在graphiql浏览器上。 我错过了什么?非常感谢。