Я получаю от своего бэкэнда accessToken и refreshToken. Когда я получаю ответ со статусом 401, мне нужно заменить accessToken на refreshToken (accessToken = refreshToken) и повторить запрос. Если запрос терпит неудачу в третий раз, мне нужно попросить пользователя снова войти в систему. Я пытаюсь применить эту логику, используя код, описанный ниже, но он не работает. Запрос больше не вызывается. Как я могу это сделать?
// example of usage:
public func login(with parameters: LoginParameters) -> Single<User> {
return provider.rx.request(MultiTarget(UserTarget.login(parameters))).handleResponse(User.self, using: jsonDecoder)
}
func handleResponse<D: Decodable>(_ type: D.Type, atKeyPath keyPath: String? = nil, using decoder: JSONDecoder = JSONDecoder(), failsOnEmptyData: Bool = true) -> Single<D> {
return self.flatMap({ (response) -> Single<D> in
switch response.statusCode {
case 200...299:
RequestsFailedCount.count = 0
return Single.just(try response.map(type, atKeyPath: keyPath, using: decoder, failsOnEmptyData: failsOnEmptyData))
case 500:
return Single.error(try response.map(ResponseError.self))
default:
if response.statusCode == 401, let urlResponse = response.response {
guard RequestsFailedCount.count <= 3 else {
RequestsFailedCount.count = 0
return Single.error(InvalidChallengeError())
}
RequestsFailedCount.count += 1
if let challenge = urlResponse.allHeaderFields[HeaderType.authenticate.rawValue] as? String, challenge.contains(self.challenge) {
var keychain = KeychainManager()
keychain.accessToken = keychain.refreshToken
return self.retry(1).map(type, atKeyPath: keyPath, using: decoder, failsOnEmptyData: failsOnEmptyData)
} else {
return Single.error(try response.map(ResponseError.self))
}
} else {
return Single.error(try response.map(ResponseError.self))
}
}
})
}