0

我使用基於Django的令牌認證。 (JWT令牌由第三方生成,例如AWS Cognito,我們將只驗證簽名和到期時間)。基於Django的令牌認證,而無需用戶模型

這REST應用程序將不會有任何用戶的機型,誰消耗的API調用需要由JWT令牌只有經過身份驗證。

class JSONWebTokenAuthentication(TokenAuthentication): 
    def authenticate_credentials(self, jwtToken): 
     try: 
      payload = jwt.decode(jwtToken, secret_key,verify=True) 
      # user = User.objects.get(username='root') 
      user = AnonymousUser() 
     except (jwt.DecodeError, User.DoesNotExist): 
      raise exceptions.AuthenticationFailed('Invalid token) 
     except jwt.ExpiredSignatureError: 
      raise exceptions.AuthenticationFailed('Token has expired') 
     return (user, payload) 

在瀏覽:

@api_view(["POST"]) 
@authentication_classes((JSONWebTokenAuthentication,)) 
@permission_classes((AllowAny,)) 

上述過程,不留令牌的軌跡可言。帶/不帶令牌,APi呼叫正在工作。如果我在兩個以下的變化,它正在工作。

user = User.objects.get(username='root') 
#user = AnonymousUser() 
@permission_classes((IsAuthenticated,)) 

一種方式來做到這一點是,有ATLEAST一個用戶在我的應用程序,並說明用戶[需要的時候,所以將用相同的「用戶名」相同的用戶此Web應用程序可能會擴展到任意數量的實例有自動化。 ]。但是,我可以消除身份驗證中的「用戶」概念嗎?

回答

1

Django的REST框架在很大程度上假定請求是基於用戶身份驗證,但他們提供的身份驗證匿名請求支持。但它從「驗證(django)用戶是真實的」的標準假設中脫穎而出,通過給匿名用戶一定的權限。您的第一個案例的問題是「Allow Any」的許可裝飾器。

我建議有一個虛擬的Django用戶。 (它不會阻止您擴展到任何數量的實例)。

使用

user = User.objects.get_or_create(username='whatever')[0] 

,而不是

user = AnonymousUser() 

現在更改權限裝飾到

@permission_classes((IsAuthenticated,)) 

此用戶不能被任何人,除非你設置了密碼來登錄,而且記錄因爲此用戶不會讓您訪問您的API調用。訪問您的API的唯一方法是發送一個有效的令牌。

希望這會有所幫助。

+0

謝謝。它對我來說是一個解決方法。當我使用AWS認知等第三方工具時,我相信我們根本不應該關心Django用戶模型。 –

0

嘗試,如果在JWT令牌存在與否驗證。看來,如果它不,有效載荷根本沒有和用戶是匿名

+0

我已經試過這一點。不管 如果不是jwt_token: 返回無 API調用是任何人都可以訪問的。 –

+0

如果JWT令牌不存在,您不應該提出認證錯誤嗎? – bdbd

相關問題