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

如何为flask-restful的Resource类实现JWT身份认证

方案选型结论

优先选flask-jwt-extended,flask-jwt已经停止维护多年,存在不少安全漏洞和功能缺陷,完全不推荐在新项目中使用。flask-jwt-extended对小项目非常友好,不需要复杂配置,和flask-restful的Resource类适配也很顺畅。

具体实现步骤(无蓝图适配版)

1. 安装依赖

pip install flask flask-restful flask-jwt-extended

2. 基础初始化+完整实现示例

不需要拆分蓝图的小项目可以直接在单入口文件中完成所有配置,参考代码如下:

from flask import Flask, request
from flask_restful import Api, Resource
from flask_jwt_extended import JWTManager, create_access_token, jwt_required, get_jwt_identity

app = Flask(__name__)
# 配置JWT密钥,生产环境请换成从环境变量读取的保密值,不要硬编码
app.config["JWT_SECRET_KEY"] = "your-custom-secret-key-do-not-expose-in-production"
# 可按需配置token过期时间,单位为秒,默认15分钟
# app.config["JWT_ACCESS_TOKEN_EXPIRES"] = 3600

# 初始化扩展
jwt = JWTManager(app)
api = Api(app)

# 模拟用户数据,实际项目替换为自己的用户表查询逻辑
USER_DB = {
    "admin": "123456"
}

# 登录接口:不需要认证,用来获取访问令牌
class LoginResource(Resource):
    def post(self):
        params = request.get_json()
        username = params.get("username")
        password = params.get("password")
        # 校验用户名密码
        if not username or not password or USER_DB.get(username) != password:
            return {"msg": "用户名或密码错误"}, 401
        # 生成token,identity字段存用户唯一标识,后续可以通过接口取出
        access_token = create_access_token(identity=username)
        return {"access_token": access_token}, 200

# 私有业务接口:需要登录后才能访问
class PrivateBusinessResource(Resource):
    # 加这个装饰器就会自动校验请求中的token
    @jwt_required()
    def get(self):
        # 取出当前登录用户的标识
        current_user = get_jwt_identity()
        return {
            "code": 0,
            "msg": "请求成功",
            "current_login_user": current_user
        }, 200

# 注册路由
api.add_resource(LoginResource, "/api/login")
api.add_resource(PrivateBusinessResource, "/api/business/private")

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

3. 接口调用方法

  • 第一步调用POST /api/login,请求体传入{"username":"admin", "password":"123456"}获取返回的access_token
  • 后续访问需要认证的接口时,在请求头中添加Authorization: Bearer <你拿到的access_token>即可正常请求
小项目优化技巧

如果有多个Resource都需要加认证,可以抽一个公共基类,避免每个方法都加装饰器:

class AuthRequiredResource(Resource):
    method_decorators = [jwt_required()]

# 后续业务接口直接继承这个基类就自动带认证校验
class OrderResource(AuthRequiredResource):
    def get(self):
        current_user = get_jwt_identity()
        return {"order_list": []}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 14:24:02