Как я могу изменить токен на предъявителя в Мойе
Документация показывает, как сделать так, чтобы цели требовали токенов на предъявителя, что я и сделал
extension MyService: AccessTokenAuthorizable {
var authorizationType: AuthorizationType {
switch self {
case .resetPassword, .postTextBook, .bookmarkBook, .getBookmarks, .logout, .verify:
return .bearer
default:
return .none
}
}
}
Затем он показывает, как добавить токены для провайдеров, что я и сделал, как это
let token = "abc123"
let authPlugin = AccessTokenPlugin(tokenClosure: token)
let provider = MoyaProvider<MyService>(plugins: [authPlugin])
но когда токен истекает, как я могу изменить токен? и предлагает ли Мойя способ автоматизации этого процесса, где, если я получаю запрещенный HTTP-ответ (то есть я не авторизован), он автоматически запрашивает токен?
2 ответа
Детали реализации аутентификации / авторизации могут быть разными для каждого API. Это причина, почему Moya
не будет обрабатывать аутентификацию для вас.
Тем не менее, реализация вашей собственной аутентификации / авторизации может быть выполнена разными способами. Это будет зависеть от ваших ограничений и / или предпочтений. На сегодняшний день вы можете найти несколько решений, в общих чертах изложенных в документации Moya:
- Использовать
PluginType
добавить свой запрос к запросам. Но подумайте, что это может потенциально использоваться для обновления токена, если это необходимо. Вам также может потребоваться перехватить завершение запроса, чтобы обнаружить ошибки авторизации и применить предпочитаемый сценарий восстановления (например, обновить токен и повторить вызов). - То же самое можно реализовать с помощью
endpointClosure
и / илиrequestClosure
, - Вы также можете рассмотреть возможность реализации
Alamofire
"sRequestAdapter
а такжеRequestRetrier
, В зависимости от ваших потребностей, это может облегчить повторные попытки. Тем не менее, на них у вас не будет прямого доступа к вашемуTargetType
, так что вам может понадобиться найти способ распознавать различные необходимые методы аутентификации (т.е. вашbearer
или жеnone
).
Несколько прямых ссылок на их документацию:
Кроме того, я настоятельно рекомендую всем учиться / получать вдохновение от Eilodon's Networking
исходный код
static func send(request: TargetType) -> PrimitiveSequence<SingleTrait, Response> {
return provider.rx.request(request)
.retry(1)
.observeOn(ConcurrentDispatchQueueScheduler.init(qos: .default))
.filterSuccessfulStatusAndRedirectCodes()
.retryWhen({ (errorObservable: Observable<Error>) in
errorObservable.flatMap({ (error) -> Single<String> in
if let moyaError: MoyaError = error as? MoyaError, let response: Response = moyaError.response {
if **check forbidden http responses here** {
return provider.rx.request(.refreshToken(*your refresh token here*))
.filterSuccessfulStatusCodes()
.mapString(atKeyPath: "*json path to new access token*")
.catchError { (_) in
*Logout because getting new access token failed*
throw error
}
.flatMap({ (newAccessToken) -> PrimitiveSequence<SingleTrait, String> in
*set & save new access token*
return Single.just(newAccessToken)
})
}
}
throw error
})
})
}