客户端凭证流 - 获取访问令牌

Client Credentials Flow - getting access token

如何通过 Client Credentials Flow to Spotify by using Alamofire 收到 access_token?

到目前为止,这是我的代码:

// Spotify API
func callAlamo(url: String) {
    let parameters = ["client_id" : "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
                      "client_secret" : "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy",
                      "grant_type" : "client_credentials"]

    let headers = ["Authorization" : "Basic xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"] // <- xxx is the client_id

    Alamofire.request("https://accounts.spotify.com/api/token", method: .post, parameters: parameters, headers: headers).responseJSON(completionHandler: {
        response in
        print(response.result)
        print(response.result.value)
    })
}

这是我打印日志的一部分:

SUCCESS

Optional({ error = "invalid_client"; })

这段代码有什么问题?我是否发送了错误的参数或 headers?我是不是忘记了什么?

注:client_idclient_secret是正确的

- 如有不明之处,请私信我-

经过多天和2个问题后,我自己弄明白了。这是一个非常简单的修复,令人沮丧。

我所做的只是删除请求中的 headers 参数。

另一种选择是您可以将 headers 设置为 nil

Alamofire.request("https://accounts.spotify.com/api/token", method: .post, parameters: parameters).responseJSON(completionHandler: {
    response in
    print(response.result)
    print(response.result.value)
})

嗯,我不知道这是怎么回事。 理论上,正确的执行是: - 向 url 发出 POST 请求: https://accounts.spotify.com/api/token

  • 设为headers:

    "Content-Type": "application/x-www-form-urlencoded"

    "Authorization": "Basic xxxxx"

其中xxxxx是client_id:client_secret的base64编码字符串(所以client_id字符串和client_secret用:分隔)

  • 设为body: "grant_type": "client_credentials"

这会给你正确的回应

例如

{
    "access_token": "BQCJeyp3ocQZzSksvNn3IXuvY0NsYI26YMF400jp-7Dd8zGz6ecXyywwmSdy4jrPWwLZA_6l4e59lu8dYfg",
    "token_type": "Bearer",
    "expires_in": 3600,
    "scope": ""
}