8

我知道如何保护烧瓶中的端点,并且我想做同样的事情来招摇生成的 python 服务器存根。我想知道如何为 swagger python 服务器集成烧瓶令牌身份验证工作,因此端点将受到保护。我可以轻松地将令牌身份验证装饰器添加到烧瓶中的端点。这就是flask-restplus中的工作方式,下面的这个完全有效:

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"

如何在 swagger 生成的服务器存根上进行承载身份验证

我想知道如何将此身份验证集成到 swagger 生成的 python 服务器存根中。以下是规范文件的开始方式:

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: []

swagger python 服务器存根处的控制器

更新:我的新尝试

这是由swagger python服务器存根生成的default_controller,我尝试如下:

import connexion
import six

@api.doc(security='apikey')
@token_required
def about_get():  # noqa: E501
    return 'do some magic!'

authorize按钮不见了。为什么?

在 swagger python server stub 中,我也authorization_controller有以下代码逻辑:

from typing import List

def check_BearerAuth(token):
    return {'test_key': 'test_value'}

更新

在这里大摇大摆的python服务器存根。about_get()是一个端点,现在不安全。我们如何才能像在烧瓶中所做的那样确保这一点?任何想法?

如何about_get()在 swagger python 服务器存根中添加上述烧瓶令牌身份验证?有没有办法做到这一点?任何的想法?

4

1 回答 1

2

更新

这是使用 JWT 作为承载格式的示例 yaml: https ://github.com/zalando/connexion/blob/master/examples/openapi3/jwt/openapi.yaml

生成烧瓶服务器后,在 swagger-ui 上,您可以找到“授权”按钮。如果您在“授权”之前执行 /secret,您将收到 401 错误。

因此,对于您的情况,您必须将其更改为:

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

因此,在您安装connexion[swagger-ui]并启动服务器后,python -m swagger_server. 然后,导航到http://0.0.0.0:8080/api/v1/ui/,您可以测试身份验证是否正常工作。如果你调用/about之前的授权,它会遇到 401 错误。


要从代码中添加身份验证:

from flask_restx import Api
authorizations = {
    'Bearer Auth': {
        'type': 'apiKey',
        'in': 'header',
        'name': 'Authorization'
    },
}
api = Api(app, security='Bearer Auth', authorizations=authorizations)

顺便说一句,最好将 flask_restplus 迁移到 flask_restx,因为 flask_restplus 不再被维护。

来源

https://github.com/noirbizarre/flask-restplus/issues/398#issuecomment-444336893

于 2020-05-17T16:37:44.683 回答