Flask无数据库无用户注册场景下实现全接口JWT鉴权
Flask 个人自用API 全局JWT认证实现(无数据库/无注册流程)
完全不需要新增用户注册、存储逻辑,通过Flask全局请求钩子实现所有接口自动校验JWT,客户端自行持有密钥生成合法令牌即可。
依赖安装
先安装需要的第三方包:
pip install flask pyjwt
服务端实现
直接在你现有Flask项目里加全局前置校验逻辑即可,原有业务接口不需要做任何修改,所有请求会自动走令牌校验流程:
from flask import Flask, request, jsonify import jwt app = Flask(__name__) # 替换为你自己生成的32位以上随机字符串,客户端和服务端保持一致,建议读取环境变量避免硬编码泄露 app.config["JWT_SECRET"] = "your_strong_random_secret_key_here_make_it_long_enough" @app.before_request def jwt_auth_middleware(): # 放行跨域预检请求 if request.method == "OPTIONS": return # 如果有需要放行的公开接口,在这里加路径判断即可,比如: # if request.path in ["/health", "/favicon.ico"]: # return # 从请求头提取令牌 auth_header = request.headers.get("Authorization", "") if not auth_header.startswith("Bearer "): return jsonify({"error": "unauthorized", "msg": "missing valid token"}), 401 token = auth_header.split(" ", 1)[1].strip() try: # 校验JWT合法性,可按需增加签发人、过期时间等校验规则 jwt.decode( token, app.config["JWT_SECRET"], algorithms=["HS256"], # 开启过期时间校验的话取消注释,客户端生成令牌时需要同步传入exp字段 # options={"verify_exp": True, "require": ["exp", "iss"]}, # 可以加自定义校验,比如只允许固定签发人的令牌 # issuer="my-personal-client" ) except jwt.PyJWTError as e: return jsonify({"error": "unauthorized", "msg": f"token invalid: {str(e)}"}), 401 # 你原有的所有业务接口保持原样即可,不需要加任何额外装饰器 @app.route("/api/your_old_endpoint") def your_old_func(): return jsonify({"status": "success", "data": "hello world"}) if __name__ == "__main__": app.run()
客户端令牌生成&调用方式
客户端使用和服务端完全一致的密钥生成标准JWT即可,请求时放在Authorization请求头里,格式为Bearer <你的令牌>。以Python客户端为例:
import jwt import time import requests JWT_SECRET = "和服务端完全一致的密钥" # 生成令牌,建议加过期时间避免令牌永久泄露风险 payload = { "iss": "my-personal-client", "exp": time.time() + 7 * 24 * 3600 # 令牌7天后过期 } token = jwt.encode(payload, JWT_SECRET, algorithm="HS256") # 调用接口 resp = requests.get( "http://your-api-host/api/your_old_endpoint", headers={"Authorization": f"Bearer {token}"} ) print(resp.json())
关键说明
- 因为是个人自用场景,不需要做用户令牌存储、签发接口,密钥自己保管好不要泄露即可,完全不需要数据库支持
- 全局钩子会拦截所有接口请求,不会出现漏加认证的情况,比给每个接口加装饰器维护成本低很多
- 建议给JWT设置合理的过期时间,不要生成永久有效的令牌
- 密钥不要硬编码在代码里,最好通过环境变量读取,避免提交到代码仓库泄露
内容的提问来源于stack exchange,提问作者Ajay Kumar Joshi
相关产品推荐
相关产品推荐

