我發佈我的問題之前我已經搜索了很多,但不幸的是我無法找到解決我的問題。訪問令牌過期後處理多個未授權的請求
我開發了一個應用程序,連接到需要使用access token
和refresh token
進行驗證的服務器。
的
access token
有效期爲1 hour
,可以多次使用。refresh token
適用於1 month
,當access token
到期時使用。令牌只能使用一次。
當使用refresh token
,我得到一個新的refresh token
以及除access token
。
這裏是我的問題:
我寫了一個APIClient
class
處理所有要求,即我的應用程序的需要。這class
很好,除非access token
到期。當access token
到期時,此時將運行的所有請求都將失敗,並顯示401 code
(未經授權)。
我想要的是找到一個解決方案,它將使用refresh token
刷新access token
,然後重試所有這些失敗狀態爲code 401
的請求。請記住,刷新令牌的功能只能被調用一次,因爲refresh
令牌僅適用於一次使用。
我想要做的是找到一種方法來編寫我的APIClient
class
,以便它支持刷新令牌並重試所有失敗的請求。如果你告訴我如何實現這一點,我將非常感激。
請看下面的getRequest和sendRefreshRequest的源代碼。
func getRequestWith(requestType: FSRequestType, usingToken: Bool, parameters: RequestParameters?, completionClosure: @escaping (NetworkResult) -> Void) {
let sessioConfig = URLSessionConfiguration.default
let session = URLSession(configuration: sessioConfig, delegate: nil, delegateQueue: nil)
guard var URL = APIClient.baseURL?.appendingPathComponent(requestType.rawValue) else { return }
if let parameters = parameters {
URL = URL.appendingQueryParameters(parameters)
}
var request = URLRequest(url: URL)
request.httpMethod = "GET"
if usingToken {
let tokenString = "Bearer " + TokenManager.sharedManager.accessToken()!
request.addValue(tokenString, forHTTPHeaderField: "Authorization")
}
let task = session.dataTask(with: request) { (data, response, error) in
guard error == nil else { return completionClosure(.Error(error!.localizedDescription))}
guard let data = data else { return completionClosure(.Error("Could not load data")) }
let statusCode = (response as! HTTPURLResponse).statusCode
if statusCode == 401 {
//Handle refresh token
} else if statusCode == 200 {
let json = JSON(data: data)
let responseJSON = json["response"]
completionClosure(.Success(responseJSON))
} else {
completionClosure(.Error("Returned status code \(statusCode) from Get request with URL: \(request.url!)"))
}
}
task.resume()
}
func sendRefreshRequest() {
let session = URLSession(configuration: .default)
guard var URL = APIClient.baseURL?.appendingPathComponent(FSRequestType.RefreshToken.rawValue) else {return}
let URLParams = [
"refresh_token" : TokenManager.sharedManager.refreshToken()!
]
URL = URL.appendingQueryParameters(URLParams)
var request = URLRequest(url: URL)
request.httpMethod = "GET"
let task = session.dataTask(with: request, completionHandler: { (data, response, error) in
let statusCode = (response as! HTTPURLResponse).statusCode
if statusCode == 200 {
let json = JSON(data: data!)
if TokenManager.sharedManager.saveTokenWith(json) {
print("RefreshedToken")
} else {
print("Failed saving new token.")
SessionManager.sharedManager.deauthorize()
}
} else if statusCode == 400 {
print("The refresh token is invalid")
SessionManager.sharedManager.deauthorize()
}
})
task.resume()
}
感謝
嗨偷偷摸摸。感謝您編輯我的問題。它現在更具可讀性。我編輯了我的問題,並添加了getRequest和refreshToken函數。我希望我的問題現在不太寬泛。 – zarzonis
偉大的編輯。我收回了太寬泛的旗幟,希望你現在得到一些幫助。如果到那時你還沒有得到任何幫助,我會在晚些時候回家看看。 –
謝謝潛行。非常感激。 – zarzonis