2016-05-07 4 views
2

OAuthのアクセストークン/リフレッシュトークンフローは、私にとってUNスレッドセーフではありません。私がそれをよりよく理解できるように助けてくださいOAuthスレッドセーフですか?

OAuthを利用するAPI(this oneなど)と統合しているとします。私は自分のアクセストークンを持っており、私はAPI呼び出しを行っています。しかし、私のアクセストークンは失効し、新しいトークンが必要になります。問題はありません、私は発行されたリフレッシュトークンを使用し、新しいトークンを取得します。

上記のすべてがうまくいくと思います...しかし、マルチスレッドの世界ではありません。つまり、上記のアクションが別々のスレッドで全く同じインスタンスで2回発生した場合(たとえば、2人のユーザーが同じオブジェクトに対してAPI呼び出しを同時に要求した場合)、いつでも1つのアクセストークンしか存続できず、もう片方を取り消すことはできませんか?トランザクションの多いアプリケーションでは、これはあまり起こりません。

私はこのことが愚かな疑問であると強く感じていますが、スレッドセーフな方法を頭に入れておくことはできません。

答えて

1

Oauthはプロトコルです。特定のの実装によって、その実装が「スレッドセーフ」であるかどうかに依存します。

のOAuth2 =のOauth:!(あなたが引用したような)How is OAuth 2 different from OAuth 1?

、残りのAPIは、本質的にステートレスなので、「スレッドセーフ」の疑いが本当にありません。

最後に、ここでのOAuth2認証情報を共有する方法について良い議論は、マルチスレッド・アプリケーションの間で(あなたが資格をを確立したらそれは、ある)です:マルチスレッド・アプリケーションで

Optimizing OAuth 2.0 Requests

、資格情報は スレッド間で共有する必要があります。競合状態を回避するために、資格情報のリフレッシュを同期的に実行する必要があります( )。

クライアントライブラリは、スレッド間で資格情報を共有します。 各クライアントライブラリには、セッション(またはユーザ)オブジェクト があり、資格情報は、 ライフタイム全体にわたって再利用されます。スレッド間で資格情報を共有するには、同じ資格情報を使用して各セッションを に構成するだけです。すべてのクライアントライブラリでは、 資格情報はスレッドセーフなオブジェクトで、アクセストークンの有効期限が切れたときに同期して更新されます。

たとえば、Javaクライアントライブラリでは、シングルトンとしてCredential を作成し、すべてのセッションで共有します。

+1

ありがとう! "マルチプロセスアプリケーションまたは分散アプリケーションでは、資格情報を共有するには、それを永続化する必要があります。複数のプロセスまたはサーバーが同時に資格情報を更新しようとしないようにするには、過度のリフレッシュ要求がある場合は、中央の場所で事前に資格情報を更新し、プロセス/サーバー間で資格情報を共有することをお勧めします。 – filmnut

関連する問題