fastapi中生成jwt需用python-jose或pyjwt,密码校验通过后,以强密钥(≥32字节、环境变量读取)和含sub、exp字段的payload调用jwt.encode()签发;exp必须设为datetime.utcnow()+timedelta,且payload不包含敏感信息。

登录接口怎么生成JWT Token
FastAPI 本身不内置 JWT 功能,得靠 python-jose(推荐)或 PyJWT 手动签发。核心是:用户密码校验通过后,用密钥 + payload(如 user_id、exp)生成带签名的 token。
常见错误是直接把明文密码塞进 payload,或者漏设 exp 导致 token 永不过期——这等于裸奔。
-
exp必须设,建议用datetime.utcnow() + timedelta(minutes=30) - payload 里只放必要字段,比如
{"sub": user_id, "exp": expire},别传password_hash或权限树 - 密钥(
SECRET_KEY)必须是强随机字符串,开发环境别用"my_secret",生产务必从环境变量读取 - 返回时用
HTTPException(status_code=401)处理校验失败,别用return {"error": "xxx"}混淆状态码
怎么在路由里验证 Authorization Header 中的 Bearer Token
FastAPI 的依赖注入机制最适合做这件事:写一个 get_current_user 依赖函数,在需要保护的路由上声明它即可。关键不是“怎么解码”,而是“怎么统一拦截 + 提前失败”。
典型翻车点:token 解码后没检查 exp 字段,导致过期 token 还能访问;或没捕获 JWTError / ValueError,结果 500 内部错误暴露堆栈。
- 用
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="login")声明 token 来源位置,它会自动从Authorization: Bearer <token></token>提取值 - 在验证函数里,必须调用
jwt.decode(token, SECRET_KEY, algorithms=["HS256"]),且显式 catchExpiredSignatureError和JWTError - 解码成功后,建议查一次数据库确认
user_id是否仍有效(防账号被删但 token 没撤回) - 别在每个路由里重复写验证逻辑——全交给依赖项,FastAPI 会自动拒绝非法请求并返回 401
刷新 Token 怎么设计才安全
JWT 本身不可撤销,所以“刷新”不是延长旧 token,而是用短期有效的 access_token 换一个新的,并配合 refresh_token(存服务端、带过期、单次使用)控制权限生命周期。
很多人以为刷新就是再 decode + re-encode 一遍,结果绕过了 refresh token 校验,等于把 access token 变相永久化。
- 登录成功时,除返回
access_token(短时效,如 30 分钟),还要生成并存储一个refresh_token(长时效,如 7 天),存 Redis 或 DB,关联user_id和jti(唯一标识) - 刷新接口(如
/refresh)必须验证传入的refresh_token是否存在、未被使用、未过期 - 每次成功刷新后,立刻使原
refresh_token失效(删 Redis key 或置 flag),并下发新的 pair - 别把 refresh token 放 cookie 且没设
HttpOnly和Secure,否则 XSS 可盗取
为什么不能把 JWT 存 localStorage
因为 XSS 攻击能直接读取 localStorage,而 JWT 是有签名但无加密的凭证——拿到就能冒充用户,且服务端无法主动作废(除非加黑名单,但违背 JWT 无状态原则)。
真正该存哪?取决于你的前端架构:
- 纯 SPA(如 Vue/React)+ 后端 API:用
httpOnly+SecureCookie 存 access token,前端 JS 读不到,XSS 无法窃取;后端在响应头设Set-Cookie,并确保 FastAPI 路由返回时开启response.set_cookie(..., httponly=True) - 需要前端主动携带 token(比如调第三方 API):只能退而求其次用内存变量(如 React 的
useState),页面刷新即丢,强制重新登录 - 绝对别用
localStorage.setItem("token", ...)—— 这是教科书级反模式,连 demo 都不该这么写
JWT 的“无状态”是双刃剑:省了 session 查询,但也意味着一旦泄露就全程失控。真正的难点不在怎么签发,而在怎么限制泄露后的损害范围——Token 生命周期、存储方式、刷新机制,三者缺一不可。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











