web-dev-qa-db-ja.com

OAuthトークンの有効期限が切れているかどうかを識別する方法は?

私のiOSモバイルアプリは、OAuth2.0プロトコルで実装されたサービスを使用します。 OAuthアクセストークンは、更新トークンとexpires_inフィールド。更新トークンとアクセストークンの有効期限をアプリに保存しましたが、それらをいつ使用するかについてはよくわかりません。

  • したがって、これを使用する通常のベストプラクティスは何ですかexpires_in
  • アクセストークンの有効期限が切れていることを確認するにはどうすればよいですか?
  • アクセストークンの有効期限が切れているという一般的なWebサービスエラー形式はありますか?
31
XiOS

OAuth 2.0トークンリフレッシュに関する情報を次に示します。

定義で期限切れ

OAuth 2.0標準、 RFC 6749 )は、expires_inフィールドを有効期限までの秒数として定義します。

expires_in:推奨。アクセストークンの秒単位のライフタイム。たとえば、値「3600」は、応答が生成されてから1時間でアクセストークンが期限切れになることを示します。省略した場合、認可サーバーは、他の手段で有効期限を提供するか、デフォルト値を文書化する必要があります。

トークン更新処理:方法1

有効なaccess_tokenexpires_in値、refresh_tokenなどを受信すると、クライアントは有効期限を保存し、リクエストごとにチェックすることでこれを処理できます。これは、次の手順を使用して実行できます。

  1. expires_inを有効期限に変換します(エポック、RFC-3339/ISO-8601日時など)
  2. 有効期限を保存する
  3. 各リソース要求で、現在の時刻を有効期限と照合し、access_tokenの有効期限が切れている場合、リソース要求の前にトークンリフレッシュ要求を行います

実装例としては、Go oauth2ライブラリがあります。これは、トークンのexpires_in値をRFC 3339日時に変換します expiry propertyexpiryは、OAuth 2.0標準では定義されていませんが、ここでは便利です。

時刻を確認するときは、たとえば、すべての時刻をエポックまたはUTCタイムゾーンに変換して同じタイムゾーンを使用するなど、同じ時刻であることを確認してください。

新しいaccess_tokenを受け取ることに加えて、将来的に有効期限が切れた新しいrefresh_tokenを受け取る可能性があります。これを受け取った場合は、新しいrefresh_tokenを保存して、セッションの寿命を延ばす必要があります。

トークン更新処理:方法2

トークンの更新を処理する別の方法は、無効なトークンエラーを受信した後に手動で更新することです。これは、以前のアプローチまたは単独で実行できます。

期限切れのaccess_tokenを使用しようとして、無効なトークンエラーが発生した場合、トークンの更新を実行する必要があります(更新トークンがまだ有効な場合)。有効期限が切れたトークンには異なるサービスが異なるエラーコードを使用する可能性があるため、各サービスのコードを追跡するか、サービス全体でトークンを更新する簡単な方法は、4xxエラーが発生したときに1回更新するだけです。

無効なアクセストークンエラー

以下は、人気のあるサービスのエラーコードです。

  1. Facebook:エラー467無効なアクセストークン -アクセストークンの有効期限が切れている、取り消されている、または無効です-期限切れのアクセストークンを処理します。
  2. LinkedIn:Error 401 Unauthorized
  3. Paypal:Error 401 Unauthorized

トークンの有効期限の更新

refresh_tokenも有効期限が切れている場合は、認証プロセスを再度実行する必要があります。

OAuth 2.0仕様 は、更新トークンの有効期限またはその処理方法を定義しませんが、多くのAPIは、更新トークンの有効期限が切れるとrefresh_token_expires_inプロパティを返します。 APIごとに更新トークンの有効期限が異なるため、APIごとにドキュメントを確認することが重要ですが、通常、アクセストークンを更新するときに新しい更新トークンを受け取る場合があります。有効期限は、refresh_token_expires_inをRFC 3339日時refresh_token_expiry値に変換するなど、同様の方法で処理する必要があります。

いくつかの例には、 LinkedIneBay 、および RingCentral が含まれます。 LinkedIn APIでは、アクセストークンを更新すると、再認証が必要になるまで元の更新トークンの有効期限をターゲットとするrefresh_token_expires_inプロパティが減少した更新トークンを受け取ります。 RingCentral APIは静的な時間で更新トークンを返します。そのため、トークンの更新と更新トークンの更新が一貫して行われている場合、ユーザーは再度認証する必要はありません。

60
Grokify

上記の方法2は、トークン署名証明書の更新やクロックの違いなど、複数の理由で401が発生する可能性があるため、推奨されます。

  • APIリクエストごとに401を確認します
  • 新しいトークンを取得-1回のみ
  • APIリクエストを再試行-1回のみ

私は多くの成功したOAuthクライアントを実装し、常にこの手法を使用してきました-そして、クライアント側のコードでexpires_inフィールドを読み取ることを避けました

0
Gary Archer