Skip to content

Instantly share code, notes, and snippets.

@SergLam
Created November 16, 2019 13:49
Show Gist options
  • Save SergLam/f93a56993f8914de9976cc608e1bd0d9 to your computer and use it in GitHub Desktop.
Save SergLam/f93a56993f8914de9976cc608e1bd0d9 to your computer and use it in GitHub Desktop.
Refresh token handling with Moya
import Alamofire
import Foundation
import Moya
extension MoyaProvider {
convenience init(handleRefreshToken: Bool) {
if handleRefreshToken {
self.init(requestClosure: MoyaProvider.endpointResolver(),
manager: DefaultAlamofireManager.sharedManager,
plugins: [moyalogger])
} else {
self.init()
}
}
static func endpointResolver() -> MoyaProvider<Target>.RequestClosure {
return { endpoint, closure in
// Getting the original request
let request = try! endpoint.urlRequest()
do {
let isExpired = try EmailAuthorizationService.isTokenExpired()
if !isExpired {
// Token is valid, so just resume the original request
closure(.success(request))
return
}
//Do a request to refresh the authtoken based on refreshToken
EmailAuthorizationService.refreshTokenIfNeeded { result in
switch result {
case .success:
// This line will "resume" the actual request
closure(.success(request))
case .failure(let error):
//something went terrible wrong! Request will not be performed
closure(.failure(MoyaError.parameterEncoding(error)))
}
}
} catch {
AppRouter.shared.logOut()
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment