2016-12-28 22 views
3

我想在我的android應用程序的燒瓶中寫一個基於令牌的認證。爲此,我需要一個可以驗證用戶身份的獨特令牌。如何在python中生成一個唯一的身份驗證令牌?

Itsdangerous庫提供了一個JSONWebSignatureSerializer函數,我可以使用它創建JWT令牌。所以我的第一個問題是,使用JWT進行基於移動的身份驗證安全嗎?

其次,我對django rest框架如何生成它的標記做了一點研究。

def generate_key(self): 
    return binascii.hexlify(os.urandom(20)).decode() 

這個標記是唯一的還是隨機的?我應該使用哪一個基於移動的身份驗證?

在python中爲移動應用程序生成唯一標記的方法是什麼?

+1

而不是重新發明輪子(通常不是一個好主意,尤其是對安全性)爲什麼不使用的溶液等[燒瓶-JWT](https://pythonhosted.org/Flask-JWT/)? –

回答

3

看看uuid()庫。文檔是在這裏:

https://docs.python.org/2/library/uuid.html

和問題的前面討論的是在這裏:

How to create a GUID/UUID in Python

有很多好的細節。

+0

我已經看過,但沒有包括Django,金字塔的python框架使用UUID來生成令牌。他們正在使用binascii.hexlify(os.urandom(20))。decode() –

+0

我已經看過,但沒有一個python框架包括django,金字塔使用UUID來生成代幣。他們使用binascii.hexlify(os.urandom(20))。decode()來生成代幣。我只是想知道這是爲什麼。因爲我不用這種方法,他們正在生成一個獨特的方法。 –

+0

這個討論有用嗎? Django的uuid內置。http://stackoverflow.com/questions/3936182/using-a-uuid-as-a-primary-key-in-django-models-generic-relations-impact – vielmetti

0

你可以像上面提到的內置uuid模塊一樣使用。在3.6中發佈的新的secrets模塊也能夠創建獨特的令牌。

from uuid import uuid4 

rand_token = uuid4() 

下面的函數每次調用時都會創建一個唯一標記。 os.urandom方法返回20個隨機字節作爲字符串,並且binascii.hexlify方法將這20個字節中的每一個轉換爲該字節的2位十六進制表示形式。這就是爲什麼返回值是原來的兩倍。

如果您想使用此方法並需要令牌爲特定長度,請使用半長作爲os.urandom方法的參數。

def generate_key(self): 
    return binascii.hexlify(os.urandom(20)).decode() 
0

我寫了一個小幫助函數,用於在django模型中生成唯一的標記。您可以從模型的save()方法中調用它。它使用定義的函數生成候選標記,在數據庫中搜索現有行中的候選標記。如果它找到一個,它會再次嘗試,否則,它將返回候選字符串。請注意,這裏存在一個小的競爭條件,但不太可能在具有足夠大的輸出範圍的令牌函數時發生。

def generate_unique_token(Model, 
         token_field="token", 
         token_function=lambda: uuid.uuid4().hex[:8]): 
""" 
Generates random tokens until a unique one is found 
:param Model: a Model class that should be searched 
:param token_field: a string with the name of the token field to search in the model_class 
:param token_function: a callable that returns a candidate value 
:return: the unique candidate token 
""" 
unique_token_found = False 
while not unique_token_found: 
    token = token_function() 
    # This weird looking construction is a way to pass a value to a field with a dynamic name 
    if Model.objects.filter(**{token_field:token}).count() is 0: 
     unique_token_found = True 
return token 

然後,你可以簡單地通過調用

token = generate_unique_token(MyModelInstance, "token_field_name") 

它甚至還支持使用令牌生成的其他方法找到一個獨特的標記。例如,如果你想使用完整的UUID,你可以簡單地調用它是這樣的:

token = generate_unique_token(MyModel, "token_field_name", lambda: uuid.uuid4().hex) 
+0

這似乎是不必要的?不是Guids/uuids,取決於算法,幾乎保證是唯一的? – Moulde