Cómo implementar login decorador requerido en matraz

Tengo 2 aplicaciones de Flask (proyectos diferentes) que trabajan juntas. Uno implementa alguna API que usa tokens para autenticación. El segundo consume la API y hace una interfaz web para ello. Ahora tengo una función de inicio de sesión que envía el nombre de usuario y la contraseña a la API y, si es correcta, obtiene el token de autenticación a cambio. Una vez que tengo el token, lo guardo en la sesión del usuario y el usuario ahora debe considerarse como conectado / autentificado. ¿Cómo puedo implementar el decorador login_required para tal caso?

Aquí está mi función de inicio de sesión –

def login(self): response = make_request(BASE_URL + 'login/', clean_data(self.data)) if response.status_code == 200: session['auth_token'] = response.json().get('auth_token') return True return False 

¿Cómo puedo hacer el decorador login_required?

También estoy usando Redis para almacenar sesiones si eso importa.

También eche un vistazo a los documentos oficiales del matraz con respecto a los decoradores: http://flask.pocoo.org/docs/0.10/patterns/viewdecorators/ o los documentos de python https://www.python.org/dev/peps/pep- 0318 / también.

Su decorador debe verse algo como:

 from functools import wraps from flask import abort import jwt def authorize(f): @wraps(f) def decorated_function(*args, **kws): if not 'Authorization' in request.headers: abort(401) user = None data = request.headers['Authorization'].encode('ascii','ignore') token = str.replace(str(data), 'Bearer ','') try: user = jwt.decode(token, JWT_SECRET, algorithms=['HS256'])['sub'] except: abort(401) return f(user, *args, **kws) return decorated_function 

… y luego en tu app.py puedes tener:

 @app.route('/api/game', methods=['POST']) @authorize def create(user): data = json.loads(request.data) .... 

En este caso particular, he usado JWT como token y su token puede ser diferente, respectivamente, la deencoding del token puede ser su implementación personalizada, pero los mecanismos básicos son más o menos como en el ejemplo anterior.

Dado que cada solicitud posterior contendrá el token de API, el decorador debe hacer lo siguiente

  • Aceptar una solicitud genérica. Puedes usar * args y ** kargs para eso
  • Extraiga el token del encabezado y compárelo con el token almacenado en db (no en Redis, pero dondequiera que el token generado se almacene en el servidor)
  • Si está autenticado, los * args y ** kargs deben pasarse a la función decorada
  • La salida de la función decorada debe devolverse como está
  • Si la autenticación falla, se debe devolver un mensaje de error.

Para obtener una explicación sobre los decoradores, visite este enlace: http://thecodeship.com/patterns/guide-to-python-function-decorators/