2016-03-29 11 views
1

私はフラスコのウェブアプリケーションを持っていて、複数の青写真(restserver、webserver)を持っています。異なるフラスコの青写真のDiffernetログインビュー

webserverとrestserverの両方のエンドポイントには、ユーザーがログインする必要があります。私は@login_requiredデコレータを提供するフラスコログイン拡張を使用します。

は、それはRESTfulなの最も重要な名物の

# for web blueprint 
login_mananger.login_view = '/web/login' 

.. so on 
+0

おそらく、残りのエンドポイントのログインビューにリダイレクトすることは意味をなさないでしょう。ユーザーが認証されていない場合は、403を返します。 – davidism

+0

はい。それはまさに私が欲しいものです。 login_manager.login_view = '/ web/login'がWebサーバーの青写真に対してのみ実行されるようにするにはどうすればよいですか。 – user462455

答えて

0

一つ異なる青写真に異なるlogin_viewを持つことが可能ですステートレスである、それは要求から、サーバはクライアントからのすべての情報を「覚えていない」ことを意味しますクライアントには、認証情報を含む必要な情報がすべて含まれている必要があります。

質問に戻ると、RESTfulサービス認証にFlask-Loginを使用する必要はなく、クライアントの多様性のためにCookieやセッションを使用しないでください。もちろん、HTTP認証をDIYできますが、実際にはFlask-HTTPAuthが必要です。ここで

はフラスコ-HTTPAuthの最も単純な例である:

from flask.ext.httpauth import HTTPBasicAuth 
auth = HTTPBasicAuth() 

@auth.verify_password 
def verify_password(username, password): 
    user = User.query.filter_by(username=username).first() 
    if not user: 
     return False 
    g.current_user = user 
    # You should accomplish the verify_password function by yourself in the User model. 
    return user.verify_password(password) 

フラスコ-HTTPAuthのドキュメントによると:

コールバック関数は2つの引数、ユーザ名とパスワード を取り、 TrueまたはFalseを返す必要があります。

あなたは自分のrestserverの青写真で使用されるこの認証以来の青写真ではなく、アプリケーション全体でフラスコ-HTTPAuthの初期ことに気付くはずです。

は、それからちょうどのような機能がありフラスコログインのフラスコ-HTTPAuthによって提供さ@login_required:

認証が成功したとき、この「login_required」コールバック関数が呼び出されます
@app.route('/private') 
@auth.login_required 
def private_page(): 
    return "Only for authorized people!" 

。あなたのrestserverのルートはすべて保護されるべきなので、 "before_request"ハンドラを使って青写真全体に保護を適用することができます。私は、これはトリックを行うだろうと思い

from flask import jsonify 

@rest.before_request 
@auth.login_required 
def before_request(): 
    if not g.current_user: 
     return jsonify({'error':'Unauthorized.'}) 

:前にちょうど私たちが何をすべきかのようなあなたのrestserverの青写真の名前は「休止」されていて、「G」内のユーザーオブジェクトを保存していると仮定すると。私が上に書いたのは単なる最も単純な例であり、最初の要求の後でユーザーの資格情報をトークンに置き換えるなど、いろいろな点でより良いことができます。私はあなたがそれを理解すると信じています。

私の答えが役に立ちましたら、あなたはこの回答のために "upvote"できれば大変光栄です。

関連する問題