Oauth失败后的AlamoFire重试请求

时间:2015-06-23 19:02:02

标签: ios swift oauth alamofire

在这上面摧毁我的大脑。我有一个使用OAuth2的应用程序,我请求有一个到期的令牌。我试图找出检查过期的最佳方法,如果它已过期,请在发送新的API请求之前请求新的令牌。我有一个来自AlamoFire的Router类的枚举,它检查一个访问令牌,如下所示:

UserManager.getUser()?.getUserAccessToken()

该方法如下:

    func getUserAccessTokenForRequest() -> String? {
    if isTokenValid() {
        return self.accessToken
    }
    else {
        var localAccessToken : String?
        let request = DataManager.currentRequest as Request?
        DataManager.currentRequest?.cancel()
        DataManager.refreshToken{ (success, value) in
            if success  {
                if let returnedToken : String = value as? String {
                    request?.resume()
                }
            } else {
                if let localError: AnyObject = value {
                }
            }
        }
        return nil;
    }
}

但是当我恢复初始请求时,它是零,因为它已经完成并收到令牌无效的响应。我在遇到异步任务之前遇到了问题(因为它们是异步的)。我想知道这个最好的架构会是什么样子。在我提出请求之前,我可以检查令牌在我的数据管理器中是否有效。但是,我不想为每次通话都这样做。

覆盖创建请求方法是最好的方法吗?

1 个答案:

答案 0 :(得分:1)

更新

刚刚发现: Alamofire : How to handle errors globally

原始答案:

前一段时间我和AFNetworking做了类似的事情,我猜你可以为Alamofire实现类似的功能:

// if token was expired refresh it and retry
private class func refreshTokenAndRetry(operation: AFHTTPRequestOperation, success: (response: AnyObject!) -> Void, failure: (error: NSError!) -> Void) {
Client.refreshToken(
  success: { (credential: AFOAuthCredential!) -> Void in
    if credential != nil {
      println("Refreshed token and retrying operation")
      var request = operation.request.mutableCopy() as! NSMutableURLRequest
      request.addValue(nil, forHTTPHeaderField: "Authorization")
      request.addValue("Bearer \(credential.accessToken)", forHTTPHeaderField: "Authorization")
      let retryOperation = requestOperationManager.HTTPRequestOperationWithRequest(
        request,
        success: { (operation: AFHTTPRequestOperation!, responseObject: AnyObject!) in
          success(response: responseObject)
        },
        failure: { (operation: AFHTTPRequestOperation!, error: NSError!) in
          failure(error: error)
        }
      )
      retryOperation.start()
    }
  },
  failure: { (error) -> Void in
    failure(error: error)
  }
)
}

您缺少的是创建原始请求的可变副本,然后在标头中设置令牌并使用新请求创建新操作。