Swift 3.0令牌到期将如何自动调用令牌?

Jay*_*ngh 2 token access-token ios swift

收到令牌后,当令牌结束时,如何在登录后自动调用令牌?在同一页面上

 Alamofire.request(urlString, method: .post, parameters: newPost, encoding: JSONEncoding.default)
        .responseJSON { response in

            if let json = response.result.value as? [String : Any]{
                print("JSON: \(json)")
                if UserDefaults.standard.bool(forKey: "logged_in") {

                    Token = json["Token"]! as! String

                    UserDefaults.standard.set(Token, forKey: "Token")
                    UserDefaults.standard.synchronize()

                }

            } else {
                print("Did not receive json")
            }

            //expectation.fulfill()
    }
Run Code Online (Sandbox Code Playgroud)

Rav*_*i B 6

对于Authorisation Token,理想的做法是从服务器端他们需要检查,请求的API调用TOKEN是否有效.如果令牌未匹配或过期,他们将提供HTTP status code 401,从移动方面,您需要首先检查状态代码,如果您发现401需要强制注销或重新登录,需要一个新令牌,您可以将其保存在您的UserDefaults.


小智 5

场景 1:您需要告诉制作您的 Web 服务的后端开发人员,他需要检查 TOKEN 是否有效。如果令牌已过期,他需要提供消息代码或“令牌已过期”消息,如果消息代码已过期,您可以在响应中检查,而不需要导航登录屏幕。\n这是最佳实践。

\n\n

场景 2:如果您不想从应用程序注销,并让应用程序使用新令牌自动刷新,请告诉 Web 服务开发人员,每当令牌过期时,他都会在响应字段中返回新令牌作为“授权”,并且从您的代码方面,您需要检查每个请求中的授权是否包含新令牌。如果包含,则意味着您需要在用户默认中用新令牌替换旧令牌。

\n\n

下面是我在 Swift3 中的代码:

\n\n
func requestApiCall(_ urlString: String, paramData: NSObject, completionHandler: @escaping (NSDictionary?, NSError?) -> ()) {\n    let token =   UserDefaults.standard.object(forKey: \xe2\x80\x9ctoken\xe2\x80\x9d as String)\n    var headersVal = [\n        "Authorization": "Bearer "+(token as String),\n    ]      \n Alamofire.request(urlString, method: .post, parameters: paramData as? [String : AnyObject],encoding: JSONEncoding.default, headers: headersVal)\n\n        .responseJSON { response in\n            if let authorization = response.response?.allHeaderFields["Authorization"] as? String {\n\n                var newToken : String = authorization\n                UserDefaults.standard.set(newToken, forKey: "token")\n                UserDefaults.standard.synchronize()\n            }\n\n            switch response.result {\n\n            case .success(let value):\n\n              if let res = response.result.value {\n                     let response = res as! NSDictionary\n                     let message = response.object(forKey: "message")!\n                     print(message)\n                if message as! String ==  "Token has been expired" \n                {\n                    self.showLoginScreen()\n                }\n              }\n            completionHandler(value as? NSDictionary, nil)\n\n            case .failure(let error):\n                if error._code == -1001 {\n                    print("timeout")\n                }\n                completionHandler(nil, nil)\n            }\n      }\n}\n
Run Code Online (Sandbox Code Playgroud)\n