OAuth2PasswordBearer 是 FastAPI 提供的一种用于处理基于 Token 认证的机制,它本身不做认证,只负责:从请求头里提取 Token,并交给后续函数验证。
oauth2_scheme = OAuth2PasswordBearer(tokenUrl=”api/auth/login”)
| 参数 | 含义 |
|---|---|
tokenUrl |
指明你的 Token 获取接口在哪(用户登录时用) |
- 它不会帮你登录,也不会生成 Token,只是告诉 FastAPI —— 登录拿 Token 的接口在哪里。
- 一般就是你的登录接口,比如 /api/auth/login。
核心工作
| 作用 | 说明 |
|---|---|
| 1. 提取Token | 从请求头 Authorization: Bearer <token> 中拿到 token |
| 2. 自动校验格式 | 必须是 Bearer token,否则返回 401 |
| 3. 交给 Depends 传递给验证函数 | 把提取到的 token 字符串传入 get_current_user() |
它 不会验证 Token 是否正确、是否过期、是否伪造 —— 这需要你自己写验证逻辑(通常使用
jwt.decode())。
用户请求接口:
GET /users/me
Authorization: Bearer eyJh…
流程:
- OAuth2PasswordBearer 自动检查请求头有没有 Authorization
- 提取出 eyJh… 这个 token 字符串
- 传给 token: str = Depends(oauth2_scheme)
- 你的验证函数(如 get_current_user)再去真正验证 Token
示例
from fastapi import Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer
from jose import JWTError, jwt
oauth2_scheme = OAuth2PasswordBearer(tokenUrl=”/api/auth/login”)
SECRET_KEY = “your_secret_key”
ALGORITHM = “HS256”
# 通过JWT获取当前用户ID
def get_current_user(token: str = Depends(oauth2_scheme)):
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
user_id: int = payload.get(“user_id”)
if user_id is None:
raise HTTPException(status_code=401, detail=”Invalid token”)
return user_id
except JWTError:
raise HTTPException(status_code=401, detail=”Invalid token”)
在接口里使用:
@app.get(“/users/me”)
def read_users_me(current_user=Depends(get_current_user)):
return {“user”: current_user}