2016-07-02 5 views
2

は私がにBasicAuthを使用してリソースへの認証を有効にしていると言う:BasicAuthを使用してカスタムエンドポイントを保護する方法は?

class MyBasicAuth(BasicAuth): 
    def check_auth(self,username,password,allowed_roles,resource,method): 
     return username == 'secretusername' and password == 'secretpass' 

私もHTMLビューから文書を管理するために使用されているカスタムルートを持っています。同じMyBasicAuthを使用してすべてのカスタムルートを保護するにはどうすればよいですか?また、上記のMyBasicAuthを使用して認証するロジックを実装する必要があります。 これを手伝ってください。それは個人的な使用のため、私はユーザー名とパスワードをハードコーディングすることを好みました。

答えて

2

Eveの内部で使用されているrequires_authデコレータを利用できます。その方法は、お使いの認証クラスは、カスタムルートを保護するために使用されます:あなたは、カスタムのエンドポイントの認証を使用しようとしている場合は

from eve import Eve 
from eve.auth import requires_auth 

app = Eve() 

@app.route('/hello') 
@requires_auth('resource') 
def hello_world(): 
    return 'Hello World!' 


if __name__ == '__main__': 
    app.run() 
+0

ありがとうございます。私はそれをセッション認証で修正しました。私もこれを試してみる...あなたに感謝。 – DEVV911

+0

ようこそ。それがあなたのために働くならば、それを解決されたものとしてマークするようにしてください。 –

+0

ああ、それははるかに簡単です@ニコラ・イロッチ!それはeve docsで利用できるはずです。 – gcw

0

あなたのカスタムルートにフラスコの青写真を使用している場合は、青写真でその前に要求機能を追加することができます。

まず、青写真から認証を確認する関数を作成します。あなたはこのように、自分でフラスコ要求からAuthorizationヘッダーを取得する必要があります:

from flask import request, abort, current_app 
from werkzeug.http import parse_authorization_header 

def check_blueprint_auth(): 
    if 'Authorization' not in request.headers: 
     print('Authorization header not found for authentication') 
     return abort(401, 'Authorization header not found for authentication') 
    header = parse_authorization_header(request.headers['Authorization']) 
    username = None if header is None else header['username'] 
    password = None if header is None else header['password'] 

    return username == 'secretusername' and password == 'secretpass' 

その後、あなたはそれぞれの青写真の要求の前に呼ばれるように、この機能を設定することができます。以下はbefore_request機能を設定し、青写真の定義の例です:

from flask import Blueprint, current_app as app 
# your auth function 
from auth import check_blueprint_auth 

blueprint = Blueprint('prefix_uri', __name__) 

# this sets the auth function to be called 
blueprint.before_request(check_blueprint_auth) 


@blueprint.route('/custom_route/<some_value>', methods=['POST']) 
def post_something(some_value): 
# something 

は最後に、あなたはあなたのeveアプリで青写真をバインドする必要があります。 hereから部分的に撮影した青写真をバインドする方法の例、:

from eve import Eve 
# your blueprint 
from users import blueprint 
from flask import current_app, request 

app = Eve() 
# register the blueprint to the main Eve application 
app.register_blueprint(blueprint) 

app.run() 

お役に立てば幸いです。

1

あなたはそれが難しいでしょう、ここで述べたように:私は終わった https://github.com/pyeve/eve/issues/860 「requires_auth」に渡されていない「リソース」の問題を回避するためのラッパーを書く:

def auth_resource(resource): 
def fdec(f): 
    @wraps(f) 
    def wrapped(*args, **kwargs): 
      return f(resource=resource, *args, **kwargs) 
    return wrapped 
return fdec 

あなたはDOMAIN認証クラスに定義することができますこの方法は:

DOMAIN = { 
    'testendpoint'= {'authentication':MyCustomAuthetication}, 
    'otherendpoints'=... 

私のアプリでは、requires_authデコレータをラップし、これを認証リソースとして追加しました。

@app.route('/testendpoint/<item>', methods=['GET']) 
@auth_resource('testendpoint') 
@requires_auth('item') 
def my_end_point_function(*args, **kwargs): 
    dosomthinghere 

限り、認証クラスは、エンドポイントの設定ファイルで定義されているように、これはまた、あなたがすべてのエンドポイントを使用していることを確認したい場合に便利かもしれ別のエンドポイントで定義されている任意の認証を再利用することができます同じ認証。

関連する問題