为了实现此功能,我们需要使用Alamofire的请求适配器和响应拦截器。请求适配器用于自动添加访问令牌到请求头中,而响应拦截器则用于捕获401响应并尝试刷新访问令牌,并使用新的令牌重试请求。
首先,我们需要创建一个自定义的请求适配器。在此适配器中,我们将检查请求是否需要添加访问令牌,并在请求中添加令牌。
class AccessTokenAdapter: RequestAdapter {
private let accessToken: String
init(accessToken: String) {
self.accessToken = accessToken
}
func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
var urlRequest = urlRequest
if let authorizationHeader = Request.authorizationHeader(
user: "",
password: accessToken
) {
urlRequest.setValue(authorizationHeader.value, forHTTPHeaderField: authorizationHeader.key)
}
return urlRequest
}
}
class RefreshTokenInterceptor: Interceptor {
typealias Input = HTTPRequest
typealias Output = HTTPRequest
private let authorizationProvider: AuthorizationProvider
init(authorizationProvider: AuthorizationProvider) {
self.authorizationProvider = authorizationProvider
}
func intercept(input: HTTPRequest, chain: Chain) -> Observable {
return chain.proceed(input)
.catchError { error -> Observable in
guard let responseError = error as? AFError,
responseError.isResponseError,
responseError.responseCode == 401 else {
throw error
}
guard let refreshToken = self.authorizationProvider.refreshToken()