【问题标题】:Client Credentials Flow - getting access token客户凭证流程 - 获取访问令牌
【发布时间】:2018-06-24 10:30:11
【问题描述】:

如何使用Alamofire 接收通过Client Credentials Flow 到Spotify 的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)
    })
}

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

成功

可选({ 错误=“无效客户端”; })

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

注意:client_idclient_secret 是正确的

-如果有不清楚的地方,请给我留言-

【问题讨论】:

    标签: ios swift alamofire spotify


    【解决方案1】:

    经过多天和 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)
    })
    

    【讨论】:

      【解决方案2】:

      嗯,我不知道这是如何工作的。 理论上,正确的执行方式是: - 向 url 发出 POST 请求: https://accounts.spotify.com/api/token

      • 设置为标题:

        “Content-Type”:“application/x-www-form-urlencoded”

        “授权”:“基本 xxxxx”

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

      • 设置为正文: "grant_type": "client_credentials"

      这会给你正确的回应

      例如。

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

      【讨论】:

      • 我昨天晚上上传了自己的答案,我所做的只是删除了标题,我得到了正确的结果
      • 是的,我明白了。但无论如何它都不正确。我不知道为什么会起作用,但是您知道,如果您想了解 spotify 指南显示的正确方式,这取决于您:) 在“授权代码流程”中,他们说:An alternative way to send the client id and secret is as request parameters (client_id and client_secret) in the POST body, instead of sending them base64-encoded in the header. 也许这甚至是有效的在客户端凭据流中