SpringセキュリティとOAuth2を使用して、JavaでRESTful Webアプリケーションを構築しています。
すべてが期待どおりに機能していて、私はアクセストークンとリフレッシュトークンの基本を理解し始めましたが、まだいくつかの不明確な点があり、インターネットを閲覧すると、さまざまな視点でさらに混乱します。
現在の実装の動作:
春のセキュリティでは、有効なのは1つだけです一度に特定のユーザーの更新トークン。 リフレッシュトークンの有効期間は300秒(5分)です。 ユーザーに新しい更新トークンを要求するたびに、同じ更新トークンが返されますが、有効期間はリセットされません。
この方法では、バックグラウンドで302秒ごとに新しい更新トークンが要求され、この更新トークンを使用して、REST呼び出しの認証ヘッダーに配置されるアクセストークンが要求されます。
ほとんどの場合これで問題ありませんが、リクエストが最初の更新トークンの有効期限が切れ、2番目のトークンがまだ返されていない300〜302秒の間に実行されると、認証エラーが発生し、ユーザーはアプリケーションからログアウトされます。
インターネットでさまざまなアドバイスを読みました。
最初の方法は、新しい更新トークンをリクエストすることですすべてのWebサービス呼び出しに対して。これは、WSリクエストごとに更新トークンを取得するために資格情報(ユーザー名/パスワード)を提供する必要があるため、考慮しませんでした。
2番目は、の有効期間を延長することです10時間(5分ではなく)の更新トークン。これはほとんどの場合解決または問題になるでしょう。ただし、ユーザーは、更新トークンの有効期限が切れてから新しいトークンを取得する前にログアウトされる可能性があります。
この問題を解決する最良の方法は何ですか。 10時間の有効期間は安全ですか?すべてのWS呼び出しに新しい更新トークンを使用することをお勧めしますか?
回答:
回答№1は1作成するのは本当に良い習慣ではないと思います呼び出しごとに新しい更新トークン。更新トークンのポイントは、有効期限が切れたときに新しいアクセストークンを取得することです。そのため、認証エラー(401を想定)が表示されたら、アクセストークンの有効期限が切れているか、有効ではないことがわかっているので、更新トークンで更新して新しいアクセストークンを取得する必要があります。アクセストークンの更新が機能しない場合、ユーザーはログアウトする必要があります。更新されたすべてのアクセストークン応答で、ユーザーが有効な更新トークンを持っている限り、新しい更新トークンを割り当てることができます。有効期限が切れます。