用户身份验证和授权成为了一个至关重要的部分。使用JWT(JSON Web Token)令牌可以方便地实现身份验证和授权功能。 FastAPI是一个基于Python的现代Web框架,它提供了简单易用的功能来处理身
时间: 2025-03-24 12:06:09 浏览: 7
FastAPI 中使用 JWT 实现用户身份验证和授权的方法
1. JWT 认证概述与工作原理
JSON Web Token (JWT) 是一种开放标准 (RFC 7519),用于在网络应用间安全传输信息。它通过加密签名确保数据的完整性和可信度[^1]。JWT 主要由三部分组成:头部(Header)、载荷(Payload)以及签名(Signature)。这种结构使得它可以被轻松解析并验证。
2. 使用 JWT 进行用户认证
在 FastAPI 中,可以通过 pyjwt
库来生成和解码 JWT。以下是实现流程的关键步骤:
- 创建登录接口:允许用户提供用户名和密码以获取 JWT。
- 生成 JWT:当用户成功登录后,服务器会返回一个包含用户信息的 JWT。
- 保护路由:仅允许携带有效 JWT 的请求访问特定资源。
3. 在 FastAPI 中实现 JWT 登录与认证
下面是一个完整的示例代码,展示如何在 FastAPI 中集成 JWT 来完成用户的身份验证和授权功能。
from fastapi import FastAPI, Depends, HTTPException, status
from pydantic import BaseModel
import jwt
from datetime import datetime, timedelta
from passlib.context import CryptContext
app = FastAPI()
SECRET_KEY = "your_secret_key"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
class Token(BaseModel):
access_token: str
token_type: str
class UserInDB(BaseModel):
username: str
hashed_password: str
fake_users_db = {
"test_user": {
"username": "test_user",
"hashed_password": pwd_context.hash("secret")
}
}
def verify_password(plain_password, hashed_password):
return pwd_context.verify(plain_password, hashed_password)
def authenticate_user(fake_db, username: str, password: str):
user = fake_db.get(username)
if not user or not verify_password(password, user['hashed_password']):
return False
return user
@app.post("/token", response_model=Token)
async def login_for_access_token(form_data: dict):
user = authenticate_user(fake_users_db, form_data["username"], form_data["password"])
if not user:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Incorrect username or password",
headers={"WWW-Authenticate": "Bearer"},
)
expire = datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
to_encode = {"sub": user["username"], "exp": expire}
encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
return {"access_token": encoded_jwt, "token_type": "bearer"}
async def get_current_user(token: str = Depends()):
credentials_exception = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Could not validate credentials",
headers={"WWW-Authenticate": "Bearer"},
)
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
username: str = payload.get("sub")
if username is None:
raise credentials_exception
except jwt.PyJWTError:
raise credentials_exception
user = fake_users_db.get(username)
if user is None:
raise credentials_exception
return user
@app.get("/users/me/")
async def read_users_me(current_user: dict = Depends(get_current_user)):
return current_user
上述代码展示了如何设置一个简单的 JWT 流程。其中包含了以下几个核心组件:
- 密码散列处理函数
verify_password
和authenticate_user
。 /token
路径负责接收用户的凭证,并返回一个有效的 JWT。- 自定义依赖项
get_current_user
解析传入的 Bearer Token 并提取当前已登录的用户信息。
4. Token 验证与自动过期机制
为了增强安全性,在生成 JWT 时设置了超时期限 (exp
) 参数。一旦超过此期限,客户端再次尝试调用受保护端点将会失败。此外,还可以利用第三方库如 PyJWT 提供的功能进一步扩展逻辑,比如刷新令牌支持等特性。
相关推荐


















