2013-08-24 293 views
3

我在Django REST框架中的令牌身份驗證中遇到了一些問題。從文檔我知道它是實現以下事項:Django REST框架身份驗證令牌

from rest_framework.authtoken.models import Token 

token = Token.objects.create(user=...) 
print token.key 

現在的問題是,究竟是什麼進去的Token.objects.create(user=...)的說法。答案here有幫助,它說這將提供一個外鍵用戶的令牌模型。我不確定我瞭解這一點。

我有我自己的用戶模型中定義的,像這樣:

class Users(models.Model): 
    userid = models.IntegerField(primary_key=True) 
    username = models.CharField(max_length=255L, unique=True, blank=True) 
    email = models.CharField(max_length=255L, unique=True, blank=True) 
    password = models.CharField(max_length=64L, blank=True) 
    registeredip = models.CharField(max_length=255L, blank=True) 
    dob = models.DateField(null=True, blank=True) 
    firstname = models.CharField(max_length=255L, blank=True) 
    lastname = models.CharField(max_length=255L, blank=True) 
    joindate = models.DateTimeField() 

    class Meta: 
     db_table = 'Users' 

我將如何創建滿足在這種情況下,某些條件的用戶令牌?

# View Pseudocode 
from rest_framework.authtoken.models import Token 

def token_request(request): 
    if user_requested_token() and token_request_is_warranted(): 
     new_token = Token.objects.create(user=request.user) #What goes here? 

任何幫助或導致任何更多的文檔/示例將真正幫助我在這裏。謝謝!

+0

你得到的錯誤是什麼?它看起來像代碼很好。 –

+0

@kroolik本身並不是一個錯誤。我只是不確定我的理由是什麼。 – geekchic

+4

'Token.objects.create(user = <您的用戶實例>)爲'<您的用戶實例>'創建一個標記。你可以在你的視圖中插入這個語句,用戶請求令牌傳遞'request.user'來代替'<你的用戶instace>'。確保'request.user'是'User'的實例,而不是'AnonymousUser'。 –

回答

1

可以肯定:我們談論的是由django rest框架提供的令牌認證?

如果是這樣,這是非常簡單的方法,其中有一個令牌(隨機40個字符),而不是用戶名和密碼。

DRF提供的是什麼表格(Token),您需要爲您的用戶創建條目,Token引用了您的用戶模型(內置或活動的自定義模型)。

最初沒有創建令牌,您需要創建它們。

有幾種方法來創建令牌,最常見的有:

  • 創建使用信號處理程序的所有用戶令牌(上創建)
  • 在後臺創建任務標記(如管理任務,從時間runining時間和創建缺少令牌)
  • 有一個特殊的API端點,將創建令牌點播,與其他用戶身份驗證方法,授權用戶

基本上這意味着,在代碼中的某處,您需要創建Token實例,並引用您的用戶實例。

Token(user=user).save() 

現在,談幾點看法:

  • 這個實現令牌是相當基本的,如您沒有任何選項可以過期使用令牌,唯一的方法是重新生成令牌 - 如果您想要過期會話和/或多個客戶端(請記住 - 每個用戶使用一個令牌,而不使用瀏覽器/會話/設備),這可能會產生問題
  • 令牌使用差隨機函數
  • 令牌存儲在數據庫中以純文本格式創建
  • 有一些提供更好,更安全令牌實現多個包,最先進的django-rest-framework-jwtdjango-rest-knox(第二個是簡單)

ps python類名應該是單數(用戶 - >用戶)

+0

使用'urandom'生成令牌確實不安全?我認爲一旦產生這些令牌就會保密,這將是一個更大的問題。 我不知道默認的DRF標記是以純文本形式存儲的。如果你使用django-rest-knox並且你的數據庫被泄露了,攻擊者是否仍然能夠通過暴力找到有效的令牌? –

+1

這個實現是加密弱的,這就是爲什麼從開始ssh使用它自己的實現;理論上甚至現有的django中使用的強大哈希都可能是強制性的,所以是的,這是可能的,質疑需要多少時間才能打破,並且在大多數情況下 - 這一次足以檢測,修復和終止所有的令牌 - 肯定這比沒有加密更好;我使用jwt令牌(來自許多原因),它非常整潔;仍在等待[HTTP簽名](https://datatracker.ietf.org/doc/draft-cavage-http-signatures/)成爲TheNewThing – Jerzyk

相關問題