成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

FastAPI 用戶認證:OAuth2 + JWT 登錄全解析,一站式入門!

開發
本文將帶你一步步實現 用戶認證 + JWT 登錄機制,讓你的 API 擁有完整的登錄保護!

你是否也想在 FastAPI 中實現登錄、認證、權限驗證?

本文將帶你一步步實現 用戶認證 + JWT 登錄機制,讓你的 API 擁有完整的登錄保護!

為什么使用 JWT?

JWT(JSON Web Token)是一種輕量級認證方式,支持:

  • 前后端分離(令牌無狀態存儲)
  • 認證效率高,適合微服務
  • 易于擴展與集成

FastAPI 內置了 OAuth2PasswordBearer 支持,結合 pyjwt 模塊,可以輕松實現。

安裝依賴

pip install python-jose[cryptography] passlib[bcrypt] python-multipart

項目結構(新增 auth 模塊)

app/
├── api/
│   └── user.py           # 用戶接口(注冊、獲取信息)
├── auth/
│   ├── auth.py           # 登錄 & 令牌生成
│   └── deps.py           # 獲取當前用戶
├── core/
│   └── security.py       # 加密與解密工具
├── models/
│   └── user.py           # 用戶模型
├── schemas/
│   └── user.py           # 請求 & 響應模型
├── main.py

創建用戶模型(models/user.py)

from tortoise.models import Model
from tortoise import fields

class User(Model):
    id = fields.IntField(pk=True)
    username = fields.CharField(max_length=50, unique=True)
    hashed_password = fields.CharField(max_length=128)

    class Meta:
        table = "user"

密碼加密工具(core/security.py)

from passlib.context import CryptContext
from jose import jwt
from datetime import datetime, timedelta

pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

SECRET_KEY = "your-secret-key"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 30

defverify_password(plain_pwd, hashed_pwd):
    return pwd_context.verify(plain_pwd, hashed_pwd)

defhash_password(password):
    return pwd_context.hash(password)

defcreate_access_token(data: dict, expires_delta: timedelta = None):
    to_encode = data.copy()
    expire = datetime.utcnow() + (expires_delta or timedelta(minutes=15))
    to_encode.update({"exp": expire})
    return jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)

用戶注冊 & 登錄(api/user.py)

from fastapi import APIRouter, HTTPException
from app.models.user import User
from app.schemas.user import UserCreate, UserOut
from app.core.security import hash_password
from app.auth.auth import authenticate_user, create_token_response

router = APIRouter(prefix="/users", tags=["用戶"])

@router.post("/register", response_model=UserOut)
asyncdefregister(user: UserCreate):
    ifawait User.get_or_none(username=user.username):
        raise HTTPException(status_code=400, detail="用戶名已存在")
    user_obj = await User.create(
        username=user.username,
        hashed_password=hash_password(user.password)
    )
    return user_obj

@router.post("/login")
asyncdeflogin(form_data: OAuth2PasswordRequestForm = Depends()):
    user = await authenticate_user(form_data.username, form_data.password)
    ifnot user:
        raise HTTPException(status_code=401, detail="用戶名或密碼錯誤")
    return create_token_response(user.username)

登錄邏輯與令牌生成(auth/auth.py)

from fastapi.security import OAuth2PasswordBearer
from fastapi import Depends
from app.models.user import User
from app.core.security import verify_password, create_access_token
from datetime import timedelta

oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/users/login")

asyncdefauthenticate_user(username: str, password: str):
    user = await User.get_or_none(username=username)
    if user and verify_password(password, user.hashed_password):
        return user
    returnNone

defcreate_token_response(username: str):
    access_token_expires = timedelta(minutes=30)
    access_token = create_access_token(
        data={"sub": username}, expires_delta=access_token_expires
    )
    return {"access_token": access_token, "token_type": "bearer"}

獲取當前用戶(auth/deps.py)

from fastapi import Depends, HTTPException
from jose import JWTError, jwt
from app.auth.auth import oauth2_scheme
from app.core.security import SECRET_KEY, ALGORITHM
from app.models.user import User

asyncdefget_current_user(token: str = Depends(oauth2_scheme)):
    try:
        payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        username = payload.get("sub")
        ifnot username:
            raise HTTPException(status_code=401, detail="認證失敗")
    except JWTError:
        raise HTTPException(status_code=401, detail="令牌無效")
    
    user = await User.get_or_none(username=username)
    ifnot user:
        raise HTTPException(status_code=404, detail="用戶不存在")
    return user

請求 & 響應模型(schemas/user.py)

from pydantic import BaseModel

class UserCreate(BaseModel):
    username: str
    password: str

class UserOut(BaseModel):
    id: int
    username: str

    class Config:
        orm_mode = True

路由使用驗證用戶(示例)

from app.auth.deps import get_current_user

@router.get("/me", response_model=UserOut)
async def get_me(current_user=Depends(get_current_user)):
    return current_user

運行 & 測試登錄流程

uvicorn app.main:app --reload
  • 訪問 /docs
  • 使用 /users/register 創建用戶
  • 使用 /users/login 獲取 JWT
  • 復制令牌,在右上角 Authorize 中粘貼
  • 測試 /users/me 接口獲取當前用戶信息

總結

通過本文你學會了:

  • JWT 的核心機制
  • 用戶注冊 + 登錄接口設計
  • 認證用戶的依賴注入
  • 保護接口,防止未授權訪問
責任編輯:趙寧寧 來源: Ssoul肥魚
相關推薦

2024-08-19 09:05:00

Seata分布式事務

2009-07-30 21:16:29

布線服務電纜架設

2017-05-04 21:30:32

前端異常監控捕獲方案

2022-09-16 11:27:46

建設微服務

2009-10-23 09:42:24

2023-10-26 06:59:58

FinOps云原生

2021-09-16 17:21:02

安超云云計算物聯網

2012-04-09 17:36:38

華為智真

2013-10-24 17:35:01

云網絡H3C電子政務

2009-07-27 11:37:04

網絡拓撲摩卡

2021-12-07 10:04:34

Azure Kuber場景應用

2014-01-13 09:00:54

PythonDjango

2010-05-06 16:02:26

2011-06-21 14:35:27

2013-05-02 14:13:44

Android開發OAuth2服務認證

2015-09-09 09:43:00

京東智能

2021-08-02 12:50:45

sessiontokenJava

2023-06-21 08:34:49

2013-06-14 09:30:52

2023-04-25 16:30:58

設備開發鴻蒙
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 第四色影音先锋 | 色就干 | 成人免费视频观看 | 日韩av一区二区在线观看 | 国产在线97 | 能免费看的av | 亚洲午夜一区二区 | 中文字幕亚洲欧美 | 亚洲一区二区在线视频 | 国产精品亚洲综合 | 欧美日韩亚 | 91亚洲精品久久久电影 | 天天干天天操天天射 | 岛国av一区二区三区 | 欧美精品在线一区二区三区 | 亚洲国产激情 | 国产在线一区二区 | 一本一道久久a久久精品综合 | 久久精品a级毛片 | 人人草天天草 | 午夜激情影院 | 国产一区二区三区在线观看免费 | 中文字幕日韩欧美 | 国产成人免费视频网站视频社区 | 欧美影院 | 在线观看av中文字幕 | 国产一区二区三区四区 | 精品国产乱码久久久久久果冻传媒 | 亚洲视频一区二区三区 | 2019天天操| 午夜影院在线播放 | 久久久久久免费精品一区二区三区 | 日本中出视频 | 久久久性色精品国产免费观看 | 日本超碰 | 久久专区 | 午夜欧美| 国产精品一区二区三级 | 久久精品一区二区三区四区 | 精品久久不卡 | 干狠狠|