トークンベースの認証をflask for my Android appで記述しようとしています。そのために、ユーザーを確認するために使用する一意のトークンが必要です。
Itsdangerousライブラリは、JWTトークンを作成できるJSONWebSignatureSerializer関数を提供します。私の最初の質問は、モバイルベースの認証にJWTを使用しても安全ですか?
次に、Django= RESTフレームワークがトークンを生成する方法について少し調査しました。
def generate_key(self):
return binascii.hexlify(os.urandom(20)).decode()
このトークンは一意ですか、それとも単なるランダムですか?モバイルベースの認証にはどちらを使用すればよいですか?
pythonでモバイルアプリケーションの一意のトークンを生成するための基本的な方法は何ですか?
組み込みのuuid
モジュールのように使用できます。 3.6でリリースされた新しいsecrets
モジュールは、一意のトークンを作成することもできます。
from uuid import uuid4
Rand_token = uuid4()
以下の関数は、呼び出されるたびに一意のトークンを作成します。 os.urandom
メソッドはランダムな20バイトを文字列として返し、binascii.hexlify
メソッドはそれらの20バイトのそれぞれをそのバイトの2桁の16進表現に変換します。これが、戻り値が2倍になる理由です。
このアプローチを使用したい場合で、トークンを特定の長さにする必要がある場合は、os.urandom
メソッドの引数として、必要な長さのhalfを使用します。
def generate_key(self):
return binascii.hexlify(os.urandom(20)).decode()
これは古いですが、とにかく私は鳴き声を上げています。決定する必要があります:一意にしますか、ランダムにしますか? 1つ選択してください。
一意にする場合は、UUIDを使用します。 UUIDの主な目的は、ユニークなものを確実に生成することです。 UUIDはUniversally Unique IDの略です。
ランダムなものが必要な場合は、os.urandom
。真にランダムな結果を一意性の制約に限定することはできません。それはそれらをランダムにしないでしょう。実際、それらはUUIDになります。
さて、あなたの質問のために、あなたは認証トークンを求めています。つまり、セキュリティの目的でこれを使用しています。 UUIDは間違ったソリューションであり、安全な番号を生成することが適切です。 UUIDの代わりに乱数を生成するときに衝突が発生しませんか?はい。しかし、膨大な数のユーザーがいない限り、そうなることはありません。あなたはこれについてあなたの計算をしたいと思うでしょう、しかし私の推薦は:あなたがランダムを使うつもりであるときUUIDを使わないでください。
オイ。
Uuid()ライブラリを見てください。ドキュメントはこちらです:
https://docs.python.org/2/library/uuid.html
そして質問の以前の議論はここにあります:
細部までこだわっています。