如何为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
相关产品推荐
相关产品推荐

