我有一个使用flask_smorest、pyJWT、flask_sqlalchemy等的flask应用程序。 我正在创建路线
/me
来获取当前用户详细信息
但是当我使用邮递员点击该网址时,它可以通过正确的标头正常工作。但在 swagger UI 的情况下则不然。使用 swagger UI 测试端点时,它没有传递 Auth 标头。
我已经声明了一个文档,用于在 blueprint.doc 装饰器中添加身份验证,如下所示 -
def login_required(f):
@wraps(f)
def wrapper(*args, **kwargs):
authorization = request.headers.get("Authorization", None)
if not authorization:
abort(403, message='no authorization token provided')
auth_type, token = authorization.split(' ')
if "Bearer" not in auth_type:
abort(403, message="Token type should be bearer")
try:
decoded_token = jwt.decode(token)
current_user = models.UserModel.get_by_email(email=decoded_token['identity'])
return f(*args, **kwargs, current_user=current_user)
except Exception as e:
abort(401, message="Invalid or expired token")
return wrapper
body = {
'name': 'Authorization',
'in': 'header',
'description': 'Authorization Bearer <access_token>',
'required': 'true',
'default': "nothing",
}
@blp.route("/me")
class Identity(MethodView):
@blp.doc(parameters=[body])
@login_required
def get(self, current_user):
print(current_user)
return {"data": current_user.to_json()}
装饰器适用于除授权之外的所有其他标头。@blp.doc
也许flask_smorest中还存在其他内置授权方法 请帮助我。
即使我像 args Schema 方式一样传递 - 它也没有通过 swagger UI 传递
@blp.arguments(AuthSchema, location='headers')
您需要添加到应用程序配置中:
API_SPEC_OPTIONS = {
"components": {
"securitySchemes": {
"Bearer Auth": {
"type": "apiKey",
"in": "header",
"name": "Authorization",
"bearerFormat": "JWT",
"description": "",
}
}
},
}
对于方法,您应该使用带有安全参数的装饰器:
@api.doc(
security=[{"Bearer Auth": []}],
)
它应该生成正确的文档。您可以阅读有关此内容的更多信息https://github.com/marshmallow-code/flask-smorest/issues/36。