如何在Flasgger(Swagger)调用Flask API时加密传输密码文本
问题原因
首先明确:OpenAPI规范中的format字段仅为字段语义的标注属性,不会触发Swagger UI自动执行任何格式转换、加密逻辑,所以你之前给password添加format: base64的配置不会生效,Swagger UI还是会按明文提交密码。
实现方案
需要分两步完成:前端Swagger UI层添加请求拦截加密,Flask后端层做对应解密校验。
1. 配置Flasgger注入Swagger UI请求拦截器
Swagger UI原生支持requestInterceptor配置,可在请求发出前自定义修改请求内容。你可以在Flasgger初始化时传入该配置,添加密码加密逻辑:
from flasgger import Swagger from flask import Flask app = Flask(__name__) # 自定义Swagger配置 swagger_config = { "swagger_ui_config": { "requestInterceptor": """ function(request) { // 仅匹配token接口的POST请求,不影响其他接口 if (request.url.includes('/api/token') && request.method === 'POST') { const reqBody = JSON.parse(request.body); if (reqBody.password) { // 此处替换为你需要的加密逻辑 // 示例为base64编码,若需要更高安全性可改为RSA公钥加密 reqBody.password = btoa(reqBody.password); request.body = JSON.stringify(reqBody); // 更新请求长度头避免报错 request.headers['Content-Length'] = request.body.length.toString(); } } return request; } """ } } # 初始化Flasgger时加载自定义配置 swagger = Swagger(app, config=swagger_config)
如果使用RSA加密,可直接在拦截器代码中预埋后端生成的公钥,不要将私钥暴露在前端代码中。
2. 后端接口添加解密逻辑
在/api/token接口中,先对收到的加密密码做解密,再走原有校验逻辑:
import base64 from flask import request, jsonify @app.route('/api/token', methods=['POST']) def generate_token(): req_data = request.get_json() username = req_data.get('username') encrypted_pwd = req_data.get('password') # 解密逻辑和前端加密逻辑对应,示例为base64解码 raw_password = base64.b64decode(encrypted_pwd).decode('utf-8') # 此处保留原有用户名密码校验逻辑 # 校验通过后返回token return jsonify({"access_token": "your_token_value"})
额外注意事项
- base64属于编码而非加密,仅能防明文直接泄露,无法对抗窃取攻击,生产环境请优先部署HTTPS保障传输安全,加密逻辑仅作为额外防护层,不可替代HTTPS。
- 你可以同步修改原有YAML字段定义中的password示例为加密后的内容,避免用户误解提交格式:
password: type: string description: '输入加密后的密码(前端自动加密,无需手动处理)' example: 'bXlwYXNzd29yZA=='
内容的提问来源于stack exchange,提问作者young_minds1
相关产品推荐
相关产品推荐

