私のiOSモバイルアプリは、OAuth2.0プロトコルで実装されたサービスを使用します。 OAuthアクセストークンは、更新トークンとexpires_in
フィールド。更新トークンとアクセストークンの有効期限をアプリに保存しましたが、それらをいつ使用するかについてはよくわかりません。
expires_in
?OAuth 2.0トークンリフレッシュに関する情報を次に示します。
定義で期限切れ
OAuth 2.0標準、 RFC 6749 )は、expires_in
フィールドを有効期限までの秒数として定義します。
expires_in:推奨。アクセストークンの秒単位のライフタイム。たとえば、値「3600」は、応答が生成されてから1時間でアクセストークンが期限切れになることを示します。省略した場合、認可サーバーは、他の手段で有効期限を提供するか、デフォルト値を文書化する必要があります。
トークン更新処理:方法1
有効なaccess_token
、expires_in
値、refresh_token
などを受信すると、クライアントは有効期限を保存し、リクエストごとにチェックすることでこれを処理できます。これは、次の手順を使用して実行できます。
expires_in
を有効期限に変換します(エポック、RFC-3339/ISO-8601日時など)access_token
の有効期限が切れている場合、リソース要求の前にトークンリフレッシュ要求を行います実装例としては、Go oauth2
ライブラリがあります。これは、トークンのexpires_in
値をRFC 3339日時に変換します expiry
property 。 expiry
は、OAuth 2.0標準では定義されていませんが、ここでは便利です。
時刻を確認するときは、たとえば、すべての時刻をエポックまたはUTCタイムゾーンに変換して同じタイムゾーンを使用するなど、同じ時刻であることを確認してください。
新しいaccess_token
を受け取ることに加えて、将来的に有効期限が切れた新しいrefresh_token
を受け取る可能性があります。これを受け取った場合は、新しいrefresh_token
を保存して、セッションの寿命を延ばす必要があります。
トークン更新処理:方法2
トークンの更新を処理する別の方法は、無効なトークンエラーを受信した後に手動で更新することです。これは、以前のアプローチまたは単独で実行できます。
期限切れのaccess_token
を使用しようとして、無効なトークンエラーが発生した場合、トークンの更新を実行する必要があります(更新トークンがまだ有効な場合)。有効期限が切れたトークンには異なるサービスが異なるエラーコードを使用する可能性があるため、各サービスのコードを追跡するか、サービス全体でトークンを更新する簡単な方法は、4xxエラーが発生したときに1回更新するだけです。
無効なアクセストークンエラー
以下は、人気のあるサービスのエラーコードです。
トークンの有効期限の更新
refresh_token
も有効期限が切れている場合は、認証プロセスを再度実行する必要があります。
OAuth 2.0仕様 は、更新トークンの有効期限またはその処理方法を定義しませんが、多くのAPIは、更新トークンの有効期限が切れるとrefresh_token_expires_in
プロパティを返します。 APIごとに更新トークンの有効期限が異なるため、APIごとにドキュメントを確認することが重要ですが、通常、アクセストークンを更新するときに新しい更新トークンを受け取る場合があります。有効期限は、refresh_token_expires_in
をRFC 3339日時refresh_token_expiry
値に変換するなど、同様の方法で処理する必要があります。
いくつかの例には、 LinkedIn 、 eBay 、および RingCentral が含まれます。 LinkedIn APIでは、アクセストークンを更新すると、再認証が必要になるまで元の更新トークンの有効期限をターゲットとするrefresh_token_expires_in
プロパティが減少した更新トークンを受け取ります。 RingCentral APIは静的な時間で更新トークンを返します。そのため、トークンの更新と更新トークンの更新が一貫して行われている場合、ユーザーは再度認証する必要はありません。
上記の方法2は、トークン署名証明書の更新やクロックの違いなど、複数の理由で401が発生する可能性があるため、推奨されます。
私は多くの成功したOAuthクライアントを実装し、常にこの手法を使用してきました-そして、クライアント側のコードでexpires_inフィールドを読み取ることを避けました