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

如何为Flask生产环境中的Swagger文档添加密码保护?

给Flask Swagger文档添加密码保护的解决方案

我来帮你搞定这个问题——给Swagger文档加访问限制其实很容易,核心就是利用Flask的认证机制来保护Swagger对应的路由。下面给你两种实用的方案,按需选择:

方案一:HTTP Basic Auth(最直接轻量)

这是最简单的方式,适合快速给单个路由加保护,不需要额外依赖第三方认证库。

步骤1:编写认证装饰器

先定义一个装饰器,用来检查请求的用户名和密码:

from flask import request, abort
from functools import wraps
import os

def swagger_auth_required(f):
    @wraps(f)
    def decorated(*args, **kwargs):
        auth = request.authorization
        # 生产环境强烈建议从环境变量读取,避免硬编码敏感信息
        allowed_user = os.getenv("SWAGGER_USER", "admin")
        allowed_pass = os.getenv("SWAGGER_PASS", "secure_password")
        
        if not auth or not (auth.username == allowed_user and auth.password == allowed_pass):
            # 返回401并提示认证要求
            abort(401, description="请输入有效的用户名和密码以访问API文档")
        return f(*args, **kwargs)
    return decorated

步骤2:给Swagger路由添加保护

在你初始化Api并绑定到app之后,找到Swagger文档对应的路由,把装饰器应用上去:

# 你的原有代码
api = Api(
    version='1.0',
    title='API',
    description='Main API',
    doc='/doc',
    authorizations=authorizations
)
api.init_app(app)

# 遍历路由,找到Swagger文档的路由并添加认证保护
for rule in app.url_map.iter_rules():
    # 匹配/doc和/doc/两种路径(Flask默认会重定向带斜杠的路径)
    if rule.rule in ('/doc', '/doc/'):
        original_view = app.view_functions[rule.endpoint]
        app.view_functions[rule.endpoint] = swagger_auth_required(original_view)

这样一来,当有人访问/doc时,浏览器会弹出登录对话框,只有输入正确的用户名和密码才能看到Swagger文档。

方案二:集成Flask-Login(适合已有用户系统的场景)

如果你的应用已经在用Flask-Login管理用户会话,可以直接用它的@login_required装饰器来保护Swagger路由,只要把上面的swagger_auth_required换成@login_required即可。不过这种方式需要用户先登录到你的应用,再访问文档,适合需要更精细权限控制的场景。

生产环境注意事项

  • 一定要用HTTPS:Basic Auth的用户名和密码是明文传输的,只有在HTTPS环境下才安全
  • 不要硬编码凭证:用环境变量、配置文件或者密钥管理工具来存储用户名和密码
  • 可选:自定义认证页面:如果你不想用浏览器默认的登录框,可以自己写一个登录页面,验证后再跳转Swagger文档

内容的提问来源于stack exchange,提问作者Ali Kompany

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:49:57