在此处为客户端凭据流使用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)。您能否提供此代码的工作版本的示例,以及为什么它能够与我的代码相反运行?
我想出来了!出于某种原因,您需要在表单数据中添加客户端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)
}
我相信你的目标如下。
>
您希望将以下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)
。因为在这种情况下,它是基本的。请删除我正在尝试对客户端凭据流进行身份验证,但一直返回错误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浏览器上。 我错过了什么?非常感谢。