2

私は以前に発行されたトークンを取り消すことを許可していますが(はい、15分後に期限切れになるように設定されていますが)、 DRF-jwt。 SO上Django rest-framework-jwtを使ってトークンを取り消す

  • 希望誰かアウトオブボックス;-)
  • としてJTIのフィールドを使用してこれを行う方法を私が表示されます:

    は今、私はいくつかのオプションを検討していますカウンター、および取り消し時には、jti> last jtiが必要です。

  • 署名手続きにユーザレベルの塩を追加し、失効時にいくつかのRedis DB

  • ストアライブトークンを、それを変更移動するための方法上記のいずれかのですか?

    は、Userモデルにjwt_issue_dtを追加します。

  • 答えて

    2

    我々はそれが私たちのプロジェクトでは、このようでした。

    ペイロードにoriginal_iatを追加します。したがって、トークンのリフレッシュはこのフィールドを変更しません。あなただけのフィールドuser.jwt_issue_dtを更新する必要がトークンを取り消すに

    from calendar import timegm 
    from rest_framework_jwt.authentication import JSONWebTokenAuthentication 
    
    class CustomJSONWebTokenAuthentication(JSONWebTokenAuthentication): 
    
        def authenticate_credentials(self, payload): 
         user = super(CustomJSONWebTokenAuthentication, self).authenticate_credentials(payload) 
         iat_timestamp = timegm(user.jwt_issue_dt.utctimetuple()) 
         if iat_timestamp != payload['iat']: 
          raise exceptions.AuthenticationFailed('Invalid payload') 
         return user 
    

    は、ペイロードとuser.jwt_issue_dtからoriginal_iatを比較します。

    +0

    ありがとうございます。このメソッドが複数のトークンをサポートしていないことを修正しましたか?私はあなたが '!='ではなく '><'でタイムスタンプを比較することができると思います。 – bavaza

    +0

    はい。有効なトークンは1つだけ必要でした。しかし 'if iat_timestamp> payload ['iat']:raise'が動作するはずです。 – Raz

    関連する問題