7

こんにちは私はflask-loginatでセッションログインをうまく処理するのを見ていました。これは、セッションにアクセスできるテンプレートやビューに適しています。

それにもかかわらず、私はuser_tokenを送信して通話を承認する方法があるかどうかを知りたいと思っています。私は文書を見て、これに関して非常に曖昧です。それは私がすべきだと言った

  • Userオブジェクトにget_auth_tokenを実装します。
  • ユーザートークンベースをロードできる@user_loader関数を装飾します。

私は次のことを見ました(私が間違っている場合は私を訂正してください)

  • 認証トークンを保存するためのCookieベースは、Cookieからトークンを取得する代わりに、パラメーター、本文、またはヘッダーの一部としてトークンを送信することを決定できる方法があります。
  • authトークンを使用して通話を認証する方法がよくわかりません。
4

3 に答える 3

9

私は自分のニーズに合った、より良いアプローチを手に入れました。基本的に、LoginManagerを非常に簡単に拡張します。フラスコプラグインのソースを見ると、@ before_requestで呼び出された呼び出しがあり、reload_userというメソッドがあることに気付くでしょう。これが私がやっていることです。

class CustomLoginManager(LoginManager):
    def reload_user(self):
        if request.headers.has_key('Authorization'):
            ctx = _request_ctx_stack.top
            ctx.user = User.get(token=request.headers['Authorization'])
            return
        super(CustomLoginManager,self).reload_user()

ヘッダーで認証キーを渡した場合、セッションベースのアプローチの代わりにこのキーを使用してロードしようとします。もちろん、キーに署名することで、このアプローチにセキュリティレイヤーを追加する必要がありますが、全体としてはこれが私です。必要です。

皆さんありがとう。

ところで、他の多くのメソッドをオーバーライドすることができます。プラグインのソースを確認することを強くお勧めします。これにより、644行のコードが何をするのかをより深く理解できます。

https://github.com/maxcountryman/flask-login/blob/master/flask_login.py

于 2013-01-26T01:36:36.870 に答える
5

Flask-Loginを使用する代わりにOAuthのようなものが必要なようです。わからない場合(ウィキペディアから引用)、OAuthは、リソース所有者に代わってリソースにアクセスするためにトークンを利用するプロトコルです。ユーザーにサイトの特定の部分に係員の鍵を渡す機能を与えることを考えてください。Google、Facebook、Twitterなどの多くのサイトでは、特定のユーザーリソースにアクセスするために、サードパーティのクライアントを認証するためにOAuthを使用しています。

現在、柔軟性が低く複雑性の低いOAuth 1.0aと、柔軟性は高いが複雑性の高いOAuth2.0が分かれています。PythonのOAuth1.0aには多くのライブラリが存在しますが、OAuth2.0には少数です。ただし、現時点で安定性が最大の関心事ではない場合は、OAuth2.0用の選択肢があります。

クライアントの場合、 OAuth 1.0aを使用している場合はFlask-OAuthを使用できます。これは、Flaskの作成者であるArminによって管理されているため、死ぬことはありません。プロバイダーには、OAuth1.0aをサポートするFlask-OAuthProviderという拡張機能があります。自分で統合してもかまわず、2.0のサポートが必要な場合は、pyoauth2はクライアントとプロバイダーの両方を提供しますが、保守は少ないように見えます。

うまくいけば、これは、Flask-Loginを使用しなくても、認​​証トークンを利用するための1つの可能な方法を探索するのに役立ちます。私の意見では、プロトコルを理解していない限り、プロトコルを再実装するべきではないので、使用しないことにした場合でも、OAuthについて読むことをお勧めします。グーグルからのこの記事やこの記事など、多くの素晴らしい記事がそこに存在します

于 2013-01-16T16:34:00.407 に答える
1

更新と同様に、Flask-Loginには「header_loader」関数があり、標準の「user_loader」と組み合わせて使用​​できます。ドキュメントから直接取得:


@login_manager.header_loader
def load_user_from_header(header_val):
    if header_val.startswith('Basic '):
        header_val = header_val.replace('Basic ', '', 1)
    try:
        header_val = base64.b64decode(header_val)
    except TypeError:
        pass
    return User.query.filter_by(api_key=header_val).first()

これがFlask-Loginドキュメントのセクションへのリンクです

于 2014-01-26T20:38:09.500 に答える