web-dev-qa-db-ja.com

django rest framework-トークン認証ログアウト

Django rest framework Docs に従ってトークン認証を実装しました。

私が読んだことから、DRFのトークン認証は非常に簡単です-ユーザーごとに1つのトークン、トークンは期限切れではなく、常に有効です(私は正しいですか?)。

より良い方法があることは理解していますが、今のところDRFトークン認証は問題ありません。

私の質問は-通常のlogoutのベストプラクティスは何ですかDRFトークン認証?

つまり、ユーザーがログアウトした場合、クライアント側からトークンを削除する必要がありますか?そして、loginで再びトークンを取得しますか?トークンを削除して新しいトークンを生成する必要がありますか?

これに経験がある人はいますか?

21
Ofek Agmon

ログアウトに使用している簡単なビューを次に示します。

from rest_framework import status
from rest_framework.response import Response
from rest_framework.views import APIView

class Logout(APIView):
    def get(self, request, format=None):
        # simply delete the token to force a login
        request.user.auth_token.delete()
        return Response(status=status.HTTP_200_OK)

次に、それをurls.pyに追加します。

urlpatterns = [
    ...
    url(r'^logout/', Logout.as_view()),
]
28
Cloud Artisans

全体IDEA OFトークン認証:

通常、認証サービスでは、トークンに関連付けられたライフタイムがあります。特定の時間が経過すると、トークンの有効期限が切れます。ここでは、有効期限がサーバーから送信されたアクセストークンを取得します。サーバーは、ユーザーが誰であるかを識別できるように、クライアントは要求ヘッダーでこのトークンを毎回送信する必要があります。有効期限がいつ切れるかを追跡するか、INVALID_TOKENエラー。その場合、サーバーから再度トークンを取得する必要があります。

Access_tokenの有効期間は、クライアントへのアクセスを許可するユーザーのログインセッションとは無関係です。 OAuth2は、ユーザーのログイン、ログアウト、またはセッションの概念を持たない、と言います。 トークンは、ユーザーが本人であるかどうかを識別するために使用されます。

トークンは、ユーザーとクライアントに対してuniqueです。 Cookieに保存して、私を覚えているようなものを有効にすることもできますが、サーバー上では削除する必要はありません。トークンの有効期限が切れるたびに、クライアントはサーバーにリクエストを送信してトークンを再度取得する必要があります。

DRF Token Autheticationでのトークンの有効期限:

現在、DRFトークン認証はこの機能をサポートしていません。自分で実装するか、この機能を提供するサードパーティのパッケージを使用する必要があります。トークンの有効期限を確認し、トークンの有効期限が切れている場合は例外を発生させる必要があります。

自分で実装するには、DRFトークン認証クラスからサブクラス化し、ロジックを追加できます。
サードパーティのパッケージ Django-rest-framework-expiring-tokens を使用することもできます。

一部の参照:
1。 RESTful APIのトークン認証:トークンを定期的に変更する必要がありますか?
2。 OAuth2を使用してGoogleでログインしたアプリケーションからログアウトする方法

7
Rahul Gupta

SessionAuthentication はあなたが本当に探しているもののようです。 BasicAuthenticationまたはTokenAuthenticationを使用してセッションを開始(ログイン)できます。次に、残りのapi呼び出しの「トークン」としてsessionidを使用します。 「トークン」は、ログアウトするか、特定のタイミングを超えると失効します。

セッション認証を使用してcsrftokenの問題が発生した場合、 this が非常に役立ちます。

1
Diansheng