13

我已根據django rest framework Docs實施了令牌認證。django rest框架 - 令牌認證註銷

形成我讀的,DRF的令牌認證非常簡單 - 每個用戶一個令牌,令牌不會過期並且始終有效(我對嗎?)。

我知道有更好的做法,但現在DRF令牌認證對我來說很好。

我的問題是 -什麼是註銷的最佳實踐與正常DRF令牌認證?

我的意思是,當用戶註銷時,我應該從客戶端刪除令牌嗎?然後在登錄再次獲取令牌?我應該刪除令牌並生成一個新的令牌嗎?

任何有此經驗的人?令牌認證的

+0

可能重複[Django的REST框架 - 理解認證和登錄](http://stackoverflow.com/questions/30546258/django-rest-framework-understanding-authentication-and-logging-in) –

回答

4

整體思路:

通常,在身份驗證服務,沒有與令牌相關聯的有效期。特定時間過後,令牌將過期。在這裏,我們得到一個訪問令牌,它有服務器發送的到期時間。現在,客戶端需要每次在請求頭中發送該令牌,以便服務器可以識別用戶是誰。我們可以跟蹤它何時到期,或者我們可以繼續使用它,直到出現INVALID_TOKEN錯誤。在這種情況下,我們將不得不再次從服務器獲取令牌。

access_token的生命週期與授予客戶端訪問權限的用戶的登錄會話無關。可以說OAuth2沒有用戶登錄或註銷或會話的概念。 令牌只是用來標識用戶,如果他是誰,他說他是誰。

令牌爲唯一爲用戶和客戶端。您可以將它保存爲cookies以啓用類似於記住我的功能,但在服務器上您不需要刪除它。每當令牌過期時,客戶端需要向服務器發送請求以再次獲取令牌。

令牌到期的DRF令牌Authetication:

目前,DRF令牌認證不支持此功能。您必須自己實施它或使用提供此功能的第三方包。它應該檢查令牌過期並在令牌過期時引發異常。

要自己實現它,您可以從DRF令牌認證類繼承並添加邏輯。
你甚至可以使用第三方包django-rest-framework-expiring-tokens

一些參考:
1. Token Authentication for RESTful API: should the token be periodically changed?
2. How to Logout of an Application Where I Used OAuth2 To Login With Google?

+0

感謝您的回答。從我讀到的內容來看,DRF令牌永不過期,對嗎? –

+0

是的,我認爲目前在DRF令牌認證中沒有令牌過期的功能。您需要實現您自己的令牌過期邏輯。 –

+0

也許這可能有幫助。 https://github.com/JamesRitchie/django-rest-framework-expiring-tokens –

1

這聽起來像SessionAuthentication是你真正尋找。您可以通過BasicAuthentication或TokenAuthentication啓動(登錄)會話。然後使用sessionid作爲其餘api調用的「令牌」。當您註銷或超過特定時間時,「令牌」將過期。

如果使用會話驗證遇到csrftoken問題,this可能會非常有幫助。

11

下面是我使用註銷一個簡單的觀點:

from django.contrib.auth.models import User 
from rest_framework import status 
from rest_framework.response import Response 
from rest_framework.views import APIView 

class Logout(APIView): 
    queryset = User.objects.all() 

    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()), 
] 
+0

不錯!謝謝! –

+2

對不起,但是'queryset'用於什麼? – dangsonbk