web-dev-qa-db-ja.com

ログアウト時にJWTトークンを破棄する方法は?

私はhapijsでjwtプラグインと戦略を使用しています。ユーザーにログインしながらjwtトークンを作成し、「jwt」戦略を通じて同じトークンを使用して他のAPIを認証できます。 「request.state.USER_SESSION」のトークンをCookieとして設定しています。USER_SESSIONはトークン名です。また、これらのトークンをデータベースに保存していません。しかし、ログアウト時にjwtトークンを破棄するにはどうすればよいですか。方法を提案してください。

36
Garima

JWTはブラウザに保存されるため、トークンを削除してクライアント側でCookieを削除します

有効期限が切れる前にサーバー側からトークンを無効にする必要がある場合は、アカウントの削除/ブロック/一時停止、パスワードの変更、権限の変更、管理者によるユーザーのログアウト、 Invalidating JSON Web Tokens ブラックリストの作成やトークンのローテーションなど、いくつかのコモンズテクニックの場合

49
pedrofb

トークンは、作成後に手動で期限切れにすることはできません。したがって、セッションのようにサーバー側でJWTを使用して実際にログアウトすることはできません。

JWTはステートレスです。つまり、ペイロードに必要なものをすべて保存し、すべてのリクエストでDBクエリの実行をスキップする必要があります。ただし、クライアント側からトークンをクリーンアップしても、トークンの自動有効期限を待つことができない厳密なログアウト機能を使用する予定の場合は、ステートレスロジックを無視してクエリを実行する必要があります。解決策は何ですか?

  • トークンに妥当な有効期限を設定します

  • ログアウト時に保存されたトークンをクライアント側から削除します

  • クエリは、許可されたすべてのリクエストでThe Blacklistに対してトークンを提供しました

ブラックリスト

もう有効ではなく、まだ期限が切れていないすべてのトークンの「ブラックリスト」。トークンの有効期限が切れるまでの残り時間に設定されるドキュメントでTTLオプションを持つDBを使用できます。

レディス

Redisはblackblistに適したオプションです。これにより、リストへのメモリアクセスが高速になります。次に、許可されたすべての要求で実行される何らかのミドルウェアで、提供されたトークンがBlacklistにあるかどうかを確認する必要があります。その場合は、不正なエラーをスローする必要があります。そうでない場合は、手放すとJWT検証が処理し、期限切れかまだアクティブかを識別します。

13
Jamil Noyda

クライアント側からのログアウト時、最も簡単な方法は、ブラウザのストレージからトークンを削除することです。

ただし、Nodeサーバー上のトークンを破棄する場合はどうなりますか?

JWTパッケージの問題は、トークンを破棄する方法や方法を提供しないことです。

したがって、サーバーサイドでトークンを破棄するには、JWTの代わりにjwt-redisパッケージを使用できます。

このライブラリ(jwt-redis)は、ライブラリjsonwebtokenの機能全体を完全に繰り返しますが、重要な追加点が1つあります。Jwt-redisでは、redisにトークンラベルを保存して有効性を検証できます。トークンを無効にします。jwt-redisでトークンを破棄するには、destroyメソッドがあります

このように動作します:

1)npmからjwt-redisをインストール

2)作成する-

var redis = require('redis');
var JWTR =  require('jwt-redis').default;
var redisClient = redis.createClient();
var jwtr = new JWTR(redisClient);

jwtr.sign(payload, secret)
    .then((token)=>{
            // your code
    })
    .catch((error)=>{
            // error handling
    });

3)検証するために-

jwtr.verify(token, secret);

4)破壊する-

jwtr.destroy(token)

:JWTで提供されるのと同じ方法で、トークンのサインイン中にexpiresInを提供できます。

0