認証を追加したい小さな API があります。API コンシューマー向けの API キーを生成できるようにしたいと考えています。その後、コンシューマはリクエスト リクエストにキーを含めることができます。
このようなことを行うFlaskライブラリはありますか? または、それを行う典型的な方法はありますか?私は検索を行いましたが、実際にこれに出くわしただけで、あまり詳しくはありません。図書館があれば探しています。
認証キーの場合、ランダムな値を作成し、その値をデータベースに保存します。random()
このようなものには不十分なエントロピーを提供するので、を使用しますos.urandom()
。
あなたが投稿したリンクには、デコレータ関数で物事を処理する方法の非常に良い例があります。デコレータ関数で、リクエストにappkey値が設定されていることを確認し、データベースで有効であることを確認してから、関数を返します。appkeyが無効で、完了した場合raise AuthenticationError("Invalid appkey")
。
リンクした例は少し紛らわしいです。関数デコレータのチェーンを作成する方法のデモンストレーションが好きですか?より良い。
def checkAppKey(fn):
def inner(*args, **kwargs): #appkey should be in kwargs
try:
AppKey.get(appkey)
except KeyError:
raise AuthenticationError("Invalid appkey")
#Whatever other errors can raise up such as db inaccessible
#We were able to access that API key, so pass onward.
#If you know nothing else will use the appkey after this, you can unset it.
return fn(*args, **kwargs)
return inner
APIキーを生成する「一般的な」方法は、UUIDを作成することです(通常、ユーザー情報のサブセットと多少ランダムな情報(現在の時刻など)のmd5ハッシュを作成します)。
ただし、すべてのAPIキーはUUIDである必要があります。md5によって作成された16進ハッシュはこの要件を満たしていますが、他の方法も確かにあります。
ユーザーのキーを作成したら、それをユーザー情報の一部としてデータベースに保存し、ユーザーのキー(通常はCookieに保存されている)が所有しているものと一致することを確認します。これの実際の仕組みは、リンク先のページに(ある程度)説明されています。