¿Cómo proteger puntos finales personalizados utilizando BasicAuth?

Digamos que he habilitado la autenticación a los recursos usando BasicAuth:

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

También tengo rutas personalizadas que se utilizan para administrar documentos desde una vista HTML. ¿Cómo uso el mismo MyBasicAuth para proteger todas las rutas personalizadas? También necesito implementar la lógica que autentica utilizando el MyBasicAuth anterior. Por favor, ayúdame con esto. Es para uso personal, así que prefiero codificar el nombre de usuario y la contraseña.

Puede aprovechar el decorador require_auth, que Eva utiliza internamente. De esa manera, su clase de autenticación también se utilizará para proteger sus rutas personalizadas:

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

Si está intentando usar una autenticación de punto final personalizada, le resultará difícil, como se menciona aquí: https://github.com/pyeve/eve/issues/860 Terminé escribiendo un contenedor para solucionar el problema de ‘recurso ‘no se pasa a’ require_auth ‘:

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

De esta manera usted puede definir en su DOMINIO una clase de autenticación:

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

Y en mi aplicación he envuelto el decorador require_auth y lo he agregado como un recurso de autenticación.

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

Siempre que se defina una clase de autenticación en el archivo de configuración para un punto final, esto también le permite reutilizar cualquier autenticación definida en otro punto final, lo que puede ser útil si desea asegurarse de que todos los puntos finales usen la misma autenticación.

Si está utilizando planos de matraz para sus rutas personalizadas, puede agregar una función de solicitud previa para que su plano haga eso.

Primero, cree una función para verificar la autenticación desde los planos. Necesita obtener el encabezado de Authorization de la solicitud del matraz usted mismo, así:

 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' 

Luego, puede configurar esta función para que se llame antes de cada solicitud de proyecto. A continuación se muestra un ejemplo de una definición de plano, que establece la función 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/', methods=['POST']) def post_something(some_value): # something 

Finalmente, debes vincular el plano con tu aplicación eve . Un ejemplo sobre cómo unir planos, tomado en parte desde aquí :

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

Espero que ayude.