認証サーバーなしでアクセストークンと更新トークンを実装しました(私のAPIサーバーも認証を行います)。
ユーザーがログアウトすると、ローカルストレージからアクセストークンと更新トークンが削除されます。しかし、サーバー上の更新トークンも削除する必要があるため、/logout
サーバーへのリクエスト。
そのログアウト要求を認証する必要がありますか?
はいとしましょう。問題は、ユーザーがログインしていない(つまり、アクセストークンの有効期限が切れている)場合、更新ウィンドウが経過すると(たとえば、1週間)、自動更新を実行できないため、強制的にログインして、ログアウトできるようにします。おかしい!
代替案は、そのエンドポイントがアクセスと更新トークンのペアを期待することですが、1)アクセストークンの期限切れを許可し、2)アクセストークンが有効であること、および更新トークンが有効かつ最新であることを確認します。その場合、データベースから更新トークンを削除します。
これを処理する一般的な方法は何ですか?私が考慮していない長所/短所はありますか?
ログアウトリソースを保護する必要はありません。
ログアウト要求でセッションが存在する場合。それは無効になります。それ以外の場合は、ログアウトページに直接リダイレクトされます。
ユーザーがリクエストしたログアウトとトークンの有効期限には違いがあると思います。
簡単に言えば、攻撃者がすべてのユーザーを強制的にログアウトしないように、/logout
エンドポイントを確実に認証する必要があります。このエンドポイントを検証しない場合、誰でも任意のユーザーをログアウトできます。したがって、このエンドポイントは保護する必要があります。
アクセストークンと更新トークンの両方が期限切れの場合-ユーザーはページに移動しようとします。 /account
およびバックエンドがアクセストークンの有効期限が切れたことを検出すると、リダイレクトしてエンドポイントを更新します。 /refresh
。
/refresh
は、更新トークンも期限切れであることを検出し、ユーザーを/login
ページにリダイレクトします。ユーザーがログインすると、ユーザーは新しい更新トークンとアクセストークンを取得し、すべてが再び順調に進みます。
すべてのアクティブな更新トークンのリストを保持している場合は、2回目のユーザーログイン中にリストを更新する必要があります。別の/logout
を呼び出す必要はありません。ただし、これらのトークンリストは通常、検証済みのポストトークン検証のみであり、トークンの有効期限が切れている場合は検証されません。
ログアウトエンドポイントを保護する、または保護しない理由は何ですか?
アクセストークンが有効かどうか(有効期限が切れていても)を確認して、更新トークンを取り消します。
なぜ:
access = expired&refresh = expired:ユーザーはとにかくログインする必要があるため、revoke
access = invalidおよび/またはrefresh = invalid:トークンがハッキング/盗難されたため、必ずrevoke
だから私が見ることができるすべての道は失効につながる。アクセストークンが有効である限り、有効期限が切れていても対応する更新トークンを取り消すだけです。
これらすべての代替策は、通常の方法でエンドポイントを保護することです。しかし、これはログアウト->更新(失敗)->ログイン->ログアウトループにつながります。私のアプローチはそれを避けます。