119、JWT無効化の問題

1286 ワード

需要
tokenがユーザーに発行されると、有効期間内にサービス側が承認しますが、tokenの有効期間内にtokenを失効させる必要がある場合は、どうすればいいですか?
この問題の適用シーン:
  • ユーザーがパスワードを変更するには、新しいtokenを発行する必要があります.有効期間中の古いtoken
  • を無効にします.
  • バックグラウンド封鎖ユーザ
  • ソリューション
    新しく生成したtokenをredisでsetタイプで保存する
    key = 'user:{}:token'.format(user_id)
    pl = redis_client.pipeline()
    pl.sadd(key, new_token)
    pl.expire(key, token   )
    pl.execute()

    キー
    を選択します.

    user:{user_id}:token
    set
    新しいtoken
    クライアントがtokenを使用して要求する場合、tokenが通過したことを検証すると、redisからそのユーザのuser:{}:tokenレコードが存在するかどうかを判断します.
  • レコードが存在しない場合は、スルーし、ビューに入る業務処理
  • を行う.
  • が存在する場合、今回要求されたtokenがredisに保存するsetにあるかどうかを比較する:
  • .
  • が存在すると、
  • が放行する.
  • setの値にない場合は、403のステータスコードを返し、トラヒックロジック
  • を処理する.
    key = 'user:{}:token'.format(user_id)
    valid_tokens = redis_client.smembers(key, token)
    if valid_tokens and token not in valid_tokens:
      return {'message': 'Invalid token'.}, 403

    説明:
  • redisレコード有効期間を設定する時間はtokenの有効期間であり、古いtokenが期限切れになると、redisのレコードも自動的に消去され、スペースを占有しないことを保証する.
  • setを使用して新しいtokenを保存する理由は、ユーザが古いtokenの有効期間内に他の複数のデバイスにログインした可能性があることを考慮して、複数の新しいtokenを生成する必要があるためであり、これらの新しいtokenはすべて保存され、新しいtokenが正常にログインすることを保証するとともに、古いtokenが
  • を無効にすることを保証することができる.