私のアプリでoauth2トークンをリフレッシュする方法についてのアドバイスが必要です。同じ時間にタスクを実行しないようにする
私はoauth2トークン(1時間後に期限が切れます)で接続されている私のAPIへの私のHTTP要求を行うためにGRPCを使用しています。
すべての要求を起動する前に、私はトークンをチェック:
アップツーデート?ネットワークリクエストを起動してください
期限が切れていますか? refreshTokenを起動する - > launch networkRequest
すべてがうまくいくようですが、クライアントがトークンを「失う」場合もあります。
問題は、2つの要求を& Bは、トークンが古くなっている場合、彼らはそれを更新します両方、正確に同じ時間にを立ち上げていることです。 私のサーバーはnewTokenAを生成し、それを返し、newTokenBを生成し(newTokenAを削除)、それを返します。 newTokenB の後にnewTokenAがクライアントに到着すると、の後にクライアントのトークントークンが正しく表示されません。
私はセマフォを使用して、同時に1つのrefreshTokenを確実に呼び出すようにしました。
私のセマフォが待っているとき、私のサーバーからの応答はありません。
let semaphore: dispatch_semaphore_t = dispatch_semaphore_create(0)
func authenticate(completion: (GRPCProtoCall) -> (Void)) -> GRPCProtoCall {
// Wait here if authenticate already called
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
// If token up to date
if isOAuth2TokenValid() {
dispatch_semaphore_signal(semaphore) // Release semaphore
completion(self.withAuthorization())
return self
}
// Refresh the outdated token
APIClient.shared.oAuth2AccessTokenRefresh { (response) -> (Void) in
dispatch_semaphore_signal(semaphore) // Release semaphore
completion(self.withAuthorization())
}
return self
}
がキューを維持し、誰かが新しいリクエストが付属してカウントは理想的なあなたは既にフェッチされているよりも大きいものであれば、できるだけ早くトークンリフレッシュするための(シリアル要求を実行することができます)(
self
はとにかく知られているように見えます)トークンは新しい要求を処理しません。 –価値があるのは、https://github.com/p2/OAuth2 Swiftフレームワークがあなたのために行うことです(公開:私はレポメンテナです)。 – Pascal