Я работаю над своей собственной реализацией OAuth2 с использованием RxSwift. Для аутентификации запроса у меня есть аутентификатор, который извлекает и сохраняет токен доступа. Поэтому, если у меня есть действующий токен доступа, Authenticator вернет его сразу, иначе он выполнит запрос к серверу. Это именно то, что делает accessTokenRequest()
.
request = authenticator
.accessTokenRequest()
.map(toAuthorizationHeader)
.flatMap {self.actualRequest(withEndpoint: endpoint, authHeader: $0)}
Проблема в том, что когда у меня есть несколько запросов, запрашивающих аутентификацию, и не хранится действительный токен доступа, Authenticator также будет делать запросы с несколькими токенами доступа. Это нежелательно, так как в идеале должен выполняться только первый запрос токена доступа, а все последующие запросы должны ждать, пока аутентификатор завершит выборку токена доступа.
По сути, я хотел бы сериализовать функцию accessTokenRequest()
, как критическую область.
Есть идеи, как этого добиться?
Большое спасибо!
ОБНОВЛЕНИЕ
Это упрощенное содержание функции accessTokenRequest()
func accessTokenRequest() -> Observable<OAuth2Credential> {
if let credential = self.cachedCredential where !credential.isExpired {
// All subsequent requests should already enter here and return right away
return Observable.just(credential)
}
...
// First request should reach here and request access token from the server.
return NetworkClient.AccessToken()
.doOnNext(cacheCredential)
}