Python基础入门 Day52:使用 FastAPI 实现 JWT 用户认证

40次阅读
没有评论

共计 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 的验证与自动用户注入机制。

正文完
 0
评论(没有评论)