web-dev-qa-db-ja.com

Django REST JWTリフレッシュ

実装Django RESTおよびJWTを使用した認証。JWTトークンの場合、有効期限が切れる前に更新する必要があります。有効期限が切れると、JWTは新しいトークンを提供しません。

モバイルデバイスの場合、トークンを10分ごとに更新する必要があります(JWT_EXPIRATION_DELTA)。ユーザーが10分以上アクティブでない場合は、ログインを要求する必要があります。 JWTトークンの有効期限が切れた後でもトークンを更新できる方法はありますか? (更新する時間を2日に制限できます)

モバイルでこの動作を処理するための最良の方法は何ですか。

ありがとう。

7
Karesh A

Oauth2. で定義されているように、更新トークンを使用できます

更新トークンは、アクセストークンを取得するために使用される資格情報です。更新トークンは、認証サーバーによってクライアントに発行され、現在のアクセストークンが無効になるか期限切れになったときに、新しいアクセストークンを取得するために使用されます。

ログインに成功したら、更新とアクセストークンを発行します。アクセストークンの有効期限はまもなくですが、更新トークンの有効期間は長くなります。安全に保管し、現在のアクセストークンの有効期限が切れたときに新しいアクセストークンを発行するために使用します

4
pedrofb

Django-rest-framework-jwtのトークンを更新する

Django-rest-framework-jwt (v。1.11.0)は、たとえば here で説明されている「RefreshTokens」をサポートしていません。更新有効期限が切れていないトークンのみをサポートします。幅がJWT_EXPIRATION_DELTAのスライド式有効期限ウィンドウを簡単に実装できます。たとえば、設定で

'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=300),
'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=7),

ログインしたままにするために、ユーザーは5分を超えて非アクティブにすることはできません( docs )。

リアルリフレッシュトークンをお願いします。

従来の「HTTPセッションとSessionID」と同様に、データベースに保存された非常に長寿命の(「期限切れにならない」)トークンである「リフレッシュトークン」を実装することができます。これは実際には、 Django-rest-framework-jwt-refresh-token のDjango-rest-framework-jwtにすでに実装されています。もう1つの可能性は、 Django-rest-framework-simplejwt を使用することです。これは、アクセストークンと更新トークンを使用してJWTも実装します(完全な例は )。

しかし、なぜ?

アクセストークンJWTのみを使用する場合と比較して、更新トークンを使用すると、アクセストークンの有効期限が切れた後にアクセスを取り消すことができます。 Refeshトークンを使用すると、非常に長い(「モバイルデバイスの寿命」)永続的なトークンを使用できます。データベースに更新トークンのコレクションを作成してそれにアクセスする場合、セッション(CookieのセッションIDとデータベーステーブルのセッションデータ)だけに固執するべきではない理由を尋ねる人がいるかもしれません。有効期限が1時間のAccessトークンを使用すると、データベースに1時間に1回アクセスする必要があります(「従来の」セッションを使用する場合は、PUT/POSTリクエストごとに1回)。さらに、JWTトークンの通常のすべての利点(たとえば、マイクロサービスネットワークでの使いやすさ)を得ることができます。

10
np8