Как защитить пользовательские конечные точки с помощью BasicAuth?

Скажем, я включил аутентификацию для ресурсов с помощью BasicAuth:

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

У меня также есть настраиваемые маршруты, которые используются для управления документами из представления HTML. Как использовать один и тот же MyBasicAuth для защиты всех настраиваемых маршрутов? Мне также нужно реализовать логику, которая аутентифицируется с использованием указанного выше MyBasicAuth. Пожалуйста, помогите мне с этим. Это для личного использования, поэтому я предпочел жестко запрограммировать имя пользователя и пароль.


person DEVV911    schedule 02.07.2016    source источник


Ответы (3)


Вы можете использовать декоратор 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()
person Nicola Iarocci    schedule 03.07.2016
comment
Спасибо. Я исправил это с помощью сеансовой аутентификации. Я тоже попробую ... спасибо. - person DEVV911; 03.07.2016
comment
Добро пожаловать. Обязательно отметьте его как решенное, если оно работает для вас, чтобы другие могли заметить это решение среди других. - person Nicola Iarocci; 03.07.2016
comment
о, это намного проще @NicolaIarocci! Он должен быть доступен в eve docs. - person gcw; 03.07.2016
comment
@gcw - это базовая фляжка, а не eve, хотя я согласен, что requires_auth на самом деле является артефактом Eve :) У меня есть сообщение об этом на моем сайте. Вероятно, следует зайти в раздел «Фрагменты» документации. - person Nicola Iarocci; 03.07.2016

Если вы пытаетесь использовать пользовательскую аутентификацию конечной точки, вам будет сложно, как упоминалось здесь: 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 = {
    '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

Пока класс аутентификации определен в файле настроек для конечной точки, это также позволяет вам повторно использовать любую аутентификацию, определенную в другой конечной точке, что может быть удобно, если вы хотите убедиться, что все конечные точки используют одну и ту же аутентификацию.

person ehindy    schedule 24.05.2017

Если вы используете flask blueprints для своих пользовательских маршрутов, вы можете добавить функцию предварительного запроса для вашего blueprint'а, чтобы сделать это.

Сначала создайте функцию для проверки аутентификации по чертежам. Вам нужно самостоятельно получить заголовок 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 приложением. Пример привязки чертежей, частично взятый из здесь:

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()

Надеюсь, это поможет.

person gcw    schedule 02.07.2016