You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 14:15:06