共计 2355 个字符,预计需要花费 6 分钟才能阅读完成。
为了保护接口安全,我们可以使用 JWT(JSON Web Token)实现用户身份认证。本节介绍如何使用 FastAPI 搭建带有登录认证功能的 REST API 服务。
一、安装依赖
pip install "python-jose[cryptography]" passlib[bcrypt]
二、创建用户模型(models.py)
在原有 User 模型基础上增加密码字段:
from sqlalchemy import Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = "users"
id = Column(Integer, primary_key=True, index=True)
name = Column(String)
email = Column(String, unique=True, index=True)
hashed_password = Column(String)
三、密码处理工具(utils.py)
from passlib.context import CryptContext
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")
def hash_password(password: str):
return pwd_context.hash(password)
def verify_password(plain_password: str, hashed_password: str):
return pwd_context.verify(plain_password, hashed_password)
四、JWT 工具函数(auth.py)
from jose import JWTError, jwt
from datetime import datetime, timedelta
SECRET_KEY = "your_secret_key"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30
def create_access_token(data: dict):
to_encode = data.copy()
expire = datetime.utcnow() + timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES)
to_encode.update({"exp": expire})
return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
五、API 路由实现(main.py)
from fastapi import FastAPI, Depends, HTTPException
from sqlalchemy.orm import Session
from database import SessionLocal
from models import User
from schemas import UserCreate
from utils import hash_password, verify_password
from auth import create_access_token
from fastapi.security import OAuth2PasswordRequestForm
app = FastAPI()
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
@app.post("/register")
def register(user: UserCreate, db: Session = Depends(get_db)):
hashed_pw = hash_password(user.password)
db_user = User(name=user.name, email=user.email, hashed_password=hashed_pw)
db.add(db_user)
db.commit()
db.refresh(db_user)
return {"msg": "User registered successfully"}
@app.post("/login")
def login(form_data: OAuth2PasswordRequestForm = Depends(), db: Session = Depends(get_db)):
user = db.query(User).filter(User.email == form_data.username).first()
if not user or not verify_password(form_data.password, user.hashed_password):
raise HTTPException(status_code=401, detail="Invalid credentials")
token = create_access_token({"sub": user.email})
return {"access_token": token, "token_type": "bearer"}
六、接口使用方式
/register:注册新用户,传入 name、email 和 password/login:用户登录,获取 JWT token
使用 Postman 或 curl 可进行测试。获取的 token 可用于后续带有权限验证的接口。
七、总结
通过 FastAPI + JWT 实现了基础的用户注册与登录认证,为后续的权限控制奠定基础。下节将介绍如何实现 token 的验证与自动用户注入机制。
正文完