Created
November 16, 2019 13:49
-
-
Save SergLam/f93a56993f8914de9976cc608e1bd0d9 to your computer and use it in GitHub Desktop.
Refresh token handling with Moya
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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