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

如何在Flask-RESTPlus中实现全局APIKey认证(无需路由装饰器)

全局APIKey认证方案(Flask-RESTPlus)

刚好遇到过类似的需求,给你两种不用逐个给路由加装饰器的全局APIKey认证方案,完美适配你的Flask-RESTPlus场景:

方法一:用Flask全局请求钩子搞定

Flask自带的before_request装饰器是个神器,它会在所有请求到达路由之前自动执行,刚好用来做全局的token验证,完全不用碰每个路由的代码。

具体实现步骤:

  1. 先写好你的token验证逻辑(比如从数据库、配置文件或者环境变量里读取合法token)
  2. 用before_request把验证函数注册成全局钩子
  3. 处理验证失败的情况,直接返回401未授权响应

代码示例:

from flask import Flask, request, jsonify
from flask_restplus import Api, Resource

app = Flask(__name__)
# 你原来的Swagger授权配置不变
authorization = {
    'apikey': {
        'type': 'apiKey',
        'in': 'header',
        'name': 'x-auth'
    }
}
api = Api(
    app,
    title='title',
    version='1.0',
    description="List of API's ",
    validate=True,
    authorizations=authorization,
    security='apikey'
)

# 模拟合法token集合(实际项目里别硬编码,从配置/数据库读)
VALID_TOKENS = {"user_token_001", "admin_token_007"}

@app.before_request
def global_api_key_check():
    # 可以排除Swagger相关路径,避免影响文档访问
    excluded_paths = ['/swagger.json', '/swaggerui/']
    if request.path in excluded_paths:
        return
    
    # 从请求头拿token
    api_key = request.headers.get('x-auth')
    # 验证逻辑
    if not api_key or api_key not in VALID_TOKENS:
        return jsonify({"error": "无效或缺失API Token"}), 401

# 示例路由,完全不用加认证装饰器
@api.route('/test')
class TestResource(Resource):
    def get(self):
        return {"message": "认证通过,访问成功!"}

if __name__ == '__main__':
    app.run(debug=True)

这样一来,除了你指定排除的路径,所有请求都会先过一遍token验证,完全不用给每个路由加额外装饰器。


方法二:自定义RESTPlus的Api类

如果想更贴合RESTPlus的架构风格,可以自定义一个Api子类,把认证逻辑封装进去,这样代码结构更清晰,也方便后续扩展。

具体实现步骤:

  1. 继承Flask-RESTPlus的Api类
  2. 在子类的初始化方法里注册全局认证检查
  3. 用自定义的Api类替换原来的Api实例

代码示例:

from flask import request, jsonify
from flask_restplus import Api, Resource
from flask_restplus._http import HTTPStatus

class AuthEnabledApi(Api):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # 把认证检查注册成全局钩子
        self.before_request(self.check_api_key)
    
    def check_api_key(self):
        # 同样排除Swagger路径
        excluded_paths = ['/swagger.json', '/swaggerui/']
        if request.path in excluded_paths:
            return
        
        api_key = request.headers.get('x-auth')
        # 替换成你的实际验证逻辑
        if not api_key or api_key != "valid_user_token":
            return jsonify({"error": "未授权:无效的API Token"}), HTTPStatus.UNAUTHORIZED

app = Flask(__name__)
authorization = {
    'apikey': {
        'type': 'apiKey',
        'in': 'header',
        'name': 'x-auth'
    }
}
# 使用自定义的带认证的Api类
api = AuthEnabledApi(
    app,
    title='title',
    version='1.0',
    description="List of API's ",
    validate=True,
    authorizations=authorization,
    security='apikey'
)

# 示例路由,依然不用加装饰器
@api.route('/test')
class TestResource(Resource):
    def get(self):
        return {"message": "认证通过,访问成功!"}

if __name__ == '__main__':
    app.run(debug=True)

这种方式把认证逻辑和Api实例绑定在一起,代码复用性更强,如果后续要调整认证规则,直接改AuthEnabledApi类就行。


小提示:

  • 如果你的应用用了多个Namespace,两种方法都能覆盖所有路由,不用担心遗漏
  • 一定要排除Swagger相关路径,不然你连Swagger文档都打不开
  • 实际项目里千万别硬编码token,建议用环境变量、数据库或者配置中心来管理合法token

内容的提问来源于stack exchange,提问作者Always a newComer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:08:26