首页 文章

Spotify API授权错误(Swift)

提问于
浏览
2

我在Swift中创建了一个小应用程序,用户可以在Spotify数据库中搜索歌曲 . 我正在使用Web API控制台>搜索项目 . 我的问题是新的OAuth系统,你必须登录和所有这些东西 . 我的授权是可以的,但是当我尝试使用以下代码获取访问令牌时,它会返回以下错误:{“error”:“server_error”,“error_description”:“意外状态:400”} . 我的代码是:

let keys = "<MY_APPLICATION_KEYS>"

    let url = NSURL(string: "https://accounts.spotify.com/api/token")

    let session = URLSession.shared

    let request = NSMutableURLRequest(url: url! as URL)

    request.httpMethod = "POST"

    request.setValue("Basic \(keys)", forHTTPHeaderField: "Authorization")

    request.setValue("client_credentials", forHTTPHeaderField: "grant_type")

    let task = session.dataTask(with: request as URLRequest) { (data, response, error) in

        guard let _: Data = data, let _: URLResponse = response, error == nil else {

            print(error!)
            return

        }

        let dataString = NSString(data: data!, encoding: String.Encoding.utf8.rawValue)
        print("Data: \(dataString!)")

        self.parseData(JSONData: data!)

    }

    task.resume()

}

var accessToken = ""

func parseData(JSONData : Data) {

    do {
        var readableJSON = try JSONSerialization.jsonObject(with: JSONData, options: .mutableContainers) as! JSONStandard

        if let token = readableJSON["access_token"] as? String {

            accessToken = token

        }

        print("Access Token: \(accessToken)")

        updateTokenInFirebase()

    }
    catch{
        print(error)
    }

非常感谢任何帮助,非常感谢您提前!

Web API的文档:Web API Link

我在Client Credentials Flow上使用第一种方法 .

1 回答

  • 0

    我知道你发布这个已经有1年了但是我遇到了同样的问题,经过几次尝试才得到它 . 你可以在Playground中测试一下 .

    import Foundation
    import PlaygroundSupport
    
    PlaygroundPage.current.needsIndefiniteExecution = true
    
    if let url = URL(string: "https://accounts.spotify.com/api/token") {
        var postRequest = URLRequest(url: url)
        postRequest.httpMethod = "POST"
        let bodyParams = "grant_type=client_credentials"
        postRequest.httpBody = bodyParams.data(using: String.Encoding.ascii, allowLossyConversion: true)
    
        let id = "your client id"
        let secret = "your secret"
        let combined = "\(id):\(secret)"
        let combo = "\(id):\(secret)".toBase64()
        postRequest.addValue("Basic \(combo)", forHTTPHeaderField: "Authorization")
    
        let task = URLSession.shared.dataTask(with: postRequest) { (data, response, error) in
            guard let data = data else {
                return
            }
            print(String(data: data, encoding: String.Encoding.utf8)!)
        }
        task.resume()
    }
    
    
    extension String {
    
        func fromBase64() -> String? {
            guard let data = Data(base64Encoded: self) else {
                return nil
            }
    
            return String(data: data, encoding: .utf8)
        }
    
        func toBase64() -> String {
            return Data(self.utf8).base64EncodedString()
        } 
    }
    

相关问题