Sé cómo asegurar el punto final en el matraz, y quiero hacer lo mismo con el código auxiliar del servidor python generado por swagger. Me pregunto cómo puedo integrar la autenticación de token de matraz para el servidor swagger python, por lo que el punto final estará protegido. Podría agregar fácilmente un decorador de autenticación de token al punto final en el matraz. Así es como funcionan las cosas en matraz-restplus y este a continuación funciona totalmente:
from flask import Flask, request, jsonify from flask_restplus import Api, Resource app = Flask(__name__) authorizations = { 'apikey' : { 'type' : 'apiKey', 'in' : 'header', 'name' : 'X-API-KEY' }, } api = Api(app, security = 'apikey',authorizations=authorizations) def token_required(f): @wraps(f) def decorated(*args, **kwargs): token = None if 'X-API-KEY' in request.headers: token = request.headers['X-API-KEY'] if not token: return {'message' : 'Token is missing.'}, 401 if token != 'mytoken': return {'message' : 'Your token is wrong, wrong, wrong!!!'}, 401 print('TOKEN: {}'.format(token)) return f(*args, **kwargs) return decorated class classResource(Resource): @api.doc(security='apikey') @token_required def get(self): return "this is test"
cómo hacer la autenticación de portador en el código auxiliar del servidor generado por Swagger :
Me pregunto cómo voy a integrar esta autenticación en el código auxiliar del servidor Python generado por Swagger. Así es como comienza el archivo de especificaciones:
openapi: 3.0.2 info: title: test api version: 1.0.0 servers: - url: /api/v1/ description: Example API Service paths: /about: get: summary: general summary description: get current version responses: '200': description: About information content: application/json: schema: $ref: '#/components/schemas/version' '401': description: Authorization information is missing or invalid. components: securitySchemes: BearerAuth: scheme: bearer type: http security: - BearerAuth: []
controlador en el código auxiliar del servidor swagger python :
actualización: mi nuevo intento :
aquí está default_controller generado por el código auxiliar del servidor swagger python y lo intenté de la siguiente manera:
import connexion import six @api.doc(security='apikey') @token_required def about_get(): # noqa: E501 return 'do some magic!'
pero falta el botón de authorize
. ¿Por qué?
en el código auxiliar del servidor swagger python, también tengo authorization_controller
que tiene la siguiente lógica de código:
from typing import List def check_BearerAuth(token): return {'test_key': 'test_value'}
actualizar :
aquí en el código auxiliar del servidor swagger python. about_get()
es un punto final y no está protegido en este momento. ¿Cómo podemos asegurar eso como lo hicimos en el matraz? ¿cualquier pensamiento?
¿Cómo puedo agregar la autenticación de token de matraz anterior a about_get()
en el código auxiliar del servidor swagger python? ¿Hay alguna manera de hacer esto? ¿alguna idea?
Actualizar
Aquí hay un ejemplo de yaml para usar JWT como formato portador: https://github.com/zalando/connexion/blob/master/examples/openapi3/jwt/openapi.yaml
Después de generar el servidor de matraz, en swagger-ui puede encontrar el botón 'Autorizar'. Y si ejecuta /secret antes de 'Autorizar' obtendrá un error 401.
Entonces, para su situación, debe cambiarlo a:
openapi: 3.0.2 info: title: test api version: 1.0.0 servers: - url: /api/v1/ description: Example API Service paths: /about: get: summary: general summary description: get current version security: - jwt: ['secret'] responses: '200': description: About information content: application/json: schema: type: string components: securitySchemes: jwt: type: http scheme: bearer bearerFormat: JWT x-bearerInfoFunc: app.decode_token
Por lo tanto, después de haber instalado connexion[swagger-ui]
e iniciar el servidor mediante python -m swagger_server
. Luego, navegue a http://0.0.0.0:8080/api/v1/ui/
, puede probar que la autenticación funciona correctamente. Si llama a /about
antes de autorizar, obtendrá un error 401.
Para agregar autenticación desde el código:
from flask_restx import Api authorizations = { 'Bearer Auth': { 'type': 'apiKey', 'in': 'header', 'name': 'Authorization' }, } api = Api(app, security='Bearer Auth', authorizations=authorizations)
Por cierto, es mejor migrar el matraz_restplus a matraz_restx, ya que el matraz_restplus ya no se mantendrá.
Fuente
https://github.com/noirbizarre/flask-restplus/issues/398#issuecomment-444336893