用户身份验证和授权成为了一个至关重要的部分。使用JWT(JSON Web Token)令牌可以方便地实现身份验证和授权功能。 FastAPI是一个基于Python的现代Web框架,它提供了简单易用的功能来处理身
时间: 2025-03-24 20:06:09 浏览: 22
### 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 来完成用户的身份验证和授权功能。
```python
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 提供的功能进一步扩展逻辑,比如刷新令牌支持等特性。
---
阅读全文
相关推荐


















