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

使用客户端凭据流的Spotify文档here:

我能够在Google应用程序脚本(Java脚本)中创建API请求。

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
  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文档规定在授权标头中的客户端凭据之前输入&qot;Basic&qot;。

但是,当我运行此代码时,我收到以下错误

数据-lang="js"数据-隐藏="假"数据-控制台="真"数据-巴贝尔="假">
{ error: 
   { status: 400,
     message: 'Only valid bearer authentication supported' } }

如果我使用的是客户端凭据流,为什么它会认为我使用的是持有者令牌?(另外,如果我将身份验证更改为持有者,我会收到401错误&无效的访问令牌)

2)。您能提供一个此代码的工作版本的示例吗?为什么它能够运行而不是我的?


解决方案

我相信您的目标如下。

  • 您要将以下cURL命令转换为Google Apps脚本。

      curl -X "POST" -H "Authorization: Basic ZjM4ZjAw...WY0MzE=" -d grant_type=client_credentials https://accounts.spotify.com/api/token
    
在本例中,grant_type=client_credentials作为表单数据发送。当我看到你的脚本时,它是作为数据发送的。并使用https://api.spotify.com/api/token的URL。但是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_CLIENT_ID + ':' + SPOTIFY_CLIENT_SECRET)})需要修改。因为在这种情况下,是Basic ###)。请删除)

引用:

  • Client Credentials Flow
  • fetch(url, params)

相关文章