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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 15:48:16