En matraz-restplus , quiero mostrar la vista de autenticación de API para mi API de matraz mínimo, donde cada vez que hago una solicitud al servidor, la primera API debería mostrar una vista protectora para pedirle al usuario que proporcione un valor de token personalizado antes de usar la API llamada. Se me ocurrió mi solución para hacer una vista emergente de autenticación API antes de usar la función api, pero no pude obtener eso correctamente. ¿Alguien puede ayudarme a hacer que mi código funcione sin problemas? ¿Alguna idea?
Mi intento actual con implementación completa :
Aquí está el código parcial de mi implementación para hacer esta tarea.
from functools import wraps import requests, json, psycopg2, datetime from time import time from flask import Flask, request from flask_sqlalchemy import SQLAlchemy from flask_restplus import Resource, Api, abort, fields, inputs, reqparse from itsdangerous import SignatureExpired, JSONWebSignatureSerializer, BadSignature class AuthenticationToken: def __init__(self, secret_key, expires_in): self.secret_key = secret_key self.expires_in = expires_in self.serializer = JSONWebSignatureSerializer(secret_key) def generate_token(self, username): info = { 'username': username, 'creation_time': time() } token = self.serializer.dumps(info) return token.decode() def validate_token(self, token): info = self.serializer.loads(token.encode()) if time() - info['creation_time'] > self.expires_in: raise SignatureExpired("The Token has been expired; get a new token") return info['username'] SECRET_KEY = "f4b58245-6fd4-4bce-a8a4-27ca37370a3c" expires_in = 600 auth = AuthenticationToken(SECRET_KEY, expires_in) db = SQLAlchemy(app)Prácticamente codifiqué todo para la autenticación API, pero no pude obtener la vista emergente de autenticación que esperaba en mi resultado deseado.
Actualización: salida en el punto final del servidor :
Cuando probé http://127.0.0.1:5000/token en el extremo del servidor, recibí el error Not Found . ¿Cómo puedo obtener mi resultado deseado? ¿alguna idea?
Me pregunto cómo puedo obtener una vista de protección de API que requiera un token para acceder a la API. actualmente, tengo un error, no pude obtener el resultado deseado, así que espero que la comunidad SO me ayude con esto.
salida deseada :
Quiero generar una vista protectora para la API de prueba antes de usar la llamada API en el punto final del servidor. Aquí hay una vista de autorización de API de maqueta que quiero obtener:
¿Cómo puedo hacer que esto suceda usando el matraz de Python, el matraz descansado? ¿cualquier pensamiento? Gracias
Si lo entiendo correctamente, desea implementar una implementación basada en token similar a la autorización JWT .
De lo que se trata JWT se resume muy bien en docs.nginx.com > Autorización de JWT que dice
JWT es un formato de datos para la información del usuario en el estándar OpenID Connect, que es la capa de identidad estándar sobre el protocolo OAuth 2.0. Los implementadores de API y microservicios también están recurriendo al estándar JWT por su simplicidad y flexibilidad. Con la autenticación JWT, un cliente proporciona un token web JSON y el token se validará con un archivo de clave local o un servicio remoto.
No necesariamente tiene que hacer el JWT en el nivel del servidor web, pero generalmente prefiero hacer la autenticación en el nivel del servidor web para dividir bien los datos (también conocidos como puntos finales) y la seguridad.
Centrémonos ahora en JWT con matraz. El blog.teclacode.com resume muy bien el flujo de trabajo [comentarios míos]:
- El usuario proporciona su nombre de usuario y contraseña [a un extremo extraordinario]
[Los próximos 3 pasos suceden dentro de ese punto final extraordinario].
- Verificamos que sean correctos dentro de nuestra aplicación Flask
- Generamos un JWT que contiene el ID del usuario.
- Se lo enviamos al usuario.
- Cada vez que el usuario realiza una solicitud a nuestra aplicación, debe enviarnos el JWT que generamos anteriormente.
Supongo que su desafío abarca los pasos 1 a 4. El paso 5 que parece haber implementado ya: son los puntos finales no seguros más un token de parámetro POST obligatorio adicional. Esos puntos finales devolverán datos al cliente una vez que se proporcione un token válido. En otras palabras: cada punto final ordinario llama a una función que valida un token determinado. ¿Es correcto este entendimiento? ¿El paso 5 ya te funciona?
Nunca implementé JWT con python, pero una búsqueda rápida de paquetes con JWT en sus nombres me da la impresión de que hay muchos generadores de tokens listos para usar que "solo" tiene que configurar.
Un par de preguntas sobre tu código:
Podemos hacer que ese archivo sea hermoso y buscable si se corrigen algunos errores.
user_db ? Mencionaste eso en un comentario, pero no puedo encontrar eso en ningún otro lado. Sería útil tener un párrafo sobre esto en su pregunta.http://127.0.0.1:5000/token es un punto final que proporciona el token, pero no entiendo completamente la pregunta en su forma actual donde se implementa el punto final /token .Como sugieren los comentarios, no hay un simple fragmento de código que cualquiera pueda compartir para responder a esta pregunta. Básicamente, está solicitando un blog de cinco partes sobre cómo adjuntar una base de datos a una aplicación Flask para autenticar las credenciales de la API. Sé que no parece así, pero sus preguntas realmente van en cascada de un tema al siguiente. Creo que lo mejor que puede hacer es consultar las bases de datos de la Parte IV del megatutorial de Flask y los inicios de sesión de los usuarios de la Parte V. Estos tutoriales cubren los conceptos fundamentales que parecen faltar en su código, de la siguiente manera:
Por lo que vale, realmente creo que The Flask Mega-Tutorial sería útil.
ACTUALIZACIÓN: aquí hay un ejemplo mínimo que usa un diccionario como base de datos de juguetes. Algunas cosas sobre este ejemplo...
Si ejecuta main.py y va a http://127.0.0.1:5000/token?username=admin&password=somepassword , verá el ejemplo de obtención de trabajo
Si va a http://127.0.0.1:5000 , hace clic en "hello_world", hace clic en "publicar" y luego hace clic en "probarlo", puede ingresar un nombre de usuario y una contraseña, y se agregarán al base de datos simulada.
Después de agregar un nombre de usuario y contraseña, puede ir a http://127.0.0.1:5000/token?username=[]&password=[] excepto reemplazar los corchetes con ese nuevo nombre de usuario y contraseña. Si apaga el servidor, los nombres de usuario y las contraseñas no se guardarán, ya que solo se está actualizando un diccionario.
Con suerte, todo esto ayuda... una vez que haya editado la aplicación de esta manera, debería ser más fácil depurar problemas que no están relacionados con la autenticación de nombre de usuario y contraseña.