【问题标题】:Refresh uber token Swift刷新超级令牌 Swift
【发布时间】:2016-06-23 17:12:04
【问题描述】:

我尝试创建一个集成了 Uber API 的应用。

我可以获得我的 oauth 令牌,但是当我尝试刷新令牌时,API 返回 401 错误。 我对此端点发出 POST 请求 https://login.uber.com/oauth/v2/token 使用此参数:

let params = ["client_secret": ***********, "client_id": ***********, "grant_type": "refresh_token", "redirect_uri": "REDIRECT_URI", "refresh_token": refresh_token]

refresh_token 是一个 var,其中包含当我连接用户时 Uber API 返回的 refresh_token 键。

有人知道如何处理刷新我的令牌吗?

谢谢

编辑:

ViewController.swift

UberManager.refreshToken { (changed) -> Void in
    if let change = changed {
        print("token renewable")
    }
}

UberManager.swift

public class UberManager {
    static func refreshToken(completionHandler:(changed: Bool?) -> Void) -> Void {
            Router.RefreshToken().performRequest { (json, error) -> Void in
                if error == nil {
                    print(json)
                }
            }
        }
    }

Router.swift

enum Router: URLRequestConvertible {

    static let baseURL = Constants.APIConstants.api_url
    static let sandboxURL = Constants.APIConstants.sandbox_api
    static let tokenURL = Constants.APIConstants.login_url

    case RefreshToken()

    var method: Alamofire.Method {
        switch self {
        case .RefreshToken():
            return .POST
        }
    }

    var path: String {
        switch self {
        case .RefreshToken():
            return "/v2/token"
        }
    }

    var URLRequest: NSMutableURLRequest {
        var URL = NSURL()
        switch self {
        case .RefreshToken():
            URL = NSURL(string: Router.tokenURL)!
        default:
            // TODO : change this when App is ready
            URL = NSURL(string: Router.sandboxURL)!
        }
        let mutableURLRequest = NSMutableURLRequest(URL: URL.URLByAppendingPathComponent(path))
        mutableURLRequest.HTTPMethod = method.rawValue

        if let token = Session.sessionInfos().access_token {
            mutableURLRequest.setValue("Bearer \(token)", forHTTPHeaderField: "authorization")
        }

        switch self {
        case .RefreshToken():
            var params = [String: String]()
            if let refresh_token = Session.sessionInfos().refresh_token {
                params = ["client_secret": Constants.APIConstants.kSecret,
                          "client_id": Constants.APIConstants.kIDClient,
                          "grant_type": "refresh_token",
                          "redirect_uri": Constants.APIConstants.redirect_uri,
                          "refresh_token": refresh_token]
            }

            return ParameterEncoding.URL.encode(mutableURLRequest, parameters: params).0

        }
    }

    func performRequest(completionHandler: (AnyObject?, AppError?) -> Void) {
        request(self).responseData({ (response) -> Void in
            switch response.result {
            case .Failure(let error):
                print("ERROR : \(error.localizedDescription) - \(error.localizedRecoverySuggestion)")
                completionHandler(nil, AppError.Unknown)
                return
            case .Success(_):
                switch response.response!.statusCode {
                case 200, 422:
                    break // wil be handle in responseJSON
                case 401:
                    completionHandler(nil, AppError.AlamofireError)
                case 500:
                    completionHandler(nil, AppError.ServerError)
                default:
                    print("WARNING : status code \(response.response!.statusCode) not handled")
                    completionHandler(nil, AppError.Unknown)
                }
            }

        })
            .responseJSON { (response) -> Void in
            print("\n - request : \(response.request!.HTTPMethod) \(response.request!.URLString)\n\n - has body : \(response.request!.HTTPBody != nil)\n\n - response : \(response.response)\n\n - result : \(response.result)\n")
            switch response.result {
            case .Failure(_):
                completionHandler(nil, AppError.Unknown)
            case .Success(let json):
                if let responseURL = response.response {
                    switch responseURL.statusCode {
                    case 200:
                        completionHandler(json, nil)
                    case 201:
                        completionHandler(json, nil)
                    case 500:
                        completionHandler(nil, AppError.ServerError)
                    default:
                        print(responseURL)
                        print("WARNING : status code \(responseURL.statusCode) not handled")
                        completionHandler(nil, AppError.Unknown)
                    }
                }
            }
        }
    }

}

【问题讨论】:

    标签: ios swift oauth uber-api


    【解决方案1】:

    在从初始响应中提取时,您是否确保解开 refresh_token 值?我自己尝试过,并在 401 中传递了一个未包装的可选结果。

    【讨论】:

    • 是的,我知道我正在解开refresh_token 值,令牌必须过期才能更改,否则我可以在调用端点时刷新令牌?
    • 您介意分享更多代码吗?没有更多信息很难提供帮助。
    猜你喜欢
    • 1970-01-01
    • 2017-07-11
    • 2021-08-20
    • 2017-01-13
    • 2021-05-01
    • 2022-10-31
    • 2016-01-05
    • 2017-12-12
    • 2019-06-29
    相关资源
    最近更新 更多