中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁 > news >正文

廣州做網(wǎng)站建設(shè)哪家專業(yè)百度頁面

廣州做網(wǎng)站建設(shè)哪家專業(yè),百度頁面,網(wǎng)站開發(fā)整套資料,網(wǎng)站建設(shè)商業(yè)計劃書FastAPI:Token認證 本教程通過 FastAPI 實現(xiàn)用戶登錄和基于 JWT(JSON Web Token) 的認證與授權(quán),適合初學(xué)者到進階用戶。教程特別關(guān)注 Depends、OAuth2PasswordBearer 等非基礎(chǔ)操作的詳細講解,幫助你全面掌握相關(guān)技術(shù)。…

FastAPI:Token認證

本教程通過 FastAPI 實現(xiàn)用戶登錄和基于 JWT(JSON Web Token) 的認證與授權(quán),適合初學(xué)者到進階用戶。教程特別關(guān)注 DependsOAuth2PasswordBearer 等非基礎(chǔ)操作的詳細講解,幫助你全面掌握相關(guān)技術(shù)。

環(huán)境準備

首先,確保安裝必要的依賴庫:

pip install fastapi uvicorn PyJWT

什么是 JWT

JWT (JSON Web Token) 是一種輕量級的認證機制,常用于客戶端與服務(wù)器之間的通信。它主要包含三部分:

  • Header:算法與類型。
  • Payload:包含用戶信息及聲明。
  • Signature:用于校驗數(shù)據(jù)完整性。

JWT 示例:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9
.eyJzdWIiOiJ1c2VyMSIsImV4cCI6MTY5MjMyMzAwMH0
.Wu6HB7pCDHgVvmD3_a8Ev9fGzY1Kc0FnVmCvO1Wl1qM

用戶登錄的基礎(chǔ)實現(xiàn)

創(chuàng)建一個簡單的用戶登錄接口,驗證用戶名和密碼。首先實現(xiàn)模擬的用戶數(shù)據(jù)庫和基本的登錄驗證:

from fastapi import FastAPI, HTTPException
from fastapi.security import OAuth2PasswordRequestFormapp = FastAPI()# 模擬用戶數(shù)據(jù)庫
USERS_DB = {"admin": "password123","user": "mypassword"
}@app.post("/login")
async def login(form_data: OAuth2PasswordRequestForm):"""登錄接口,驗證用戶名和密碼是否匹配。"""username = form_data.usernamepassword = form_data.passwordif username not in USERS_DB or USERS_DB[username] != password:raise HTTPException(status_code=401, detail="用戶名或密碼錯誤")return {"message": f"歡迎回來,{username}!"}

啟動服務(wù):

uvicorn main:app --reload

訪問 http://127.0.0.1:8000/docs,測試 /login 接口。

JWT 的生成與驗證

引入 PyJWT 生成令牌。我們將為成功登錄的用戶生成一個包含身份信息和過期時間的 JWT。

import jwt
import datetimeSECRET_KEY = "your_secret_key"  # 替換為你的密鑰
ALGORITHM = "HS256"            # 簽名算法
TOKEN_EXPIRE_HOURS = 1         # 令牌有效時間(小時)def create_jwt(username: str) -> str:"""生成 JWT。"""payload = {"sub": username,  # 用戶名"exp": datetime.datetime.utcnow() + datetime.timedelta(hours=TOKEN_EXPIRE_HOURS)  # 過期時間}return jwt.encode(payload, SECRET_KEY, algorithm=ALGORITHM)@app.post("/login")
async def login(form_data: OAuth2PasswordRequestForm):"""登錄接口:驗證用戶名密碼并返回 JWT。"""username = form_data.usernamepassword = form_data.passwordif username not in USERS_DB or USERS_DB[username] != password:raise HTTPException(status_code=401, detail="用戶名或密碼錯誤")token = create_jwt(username)return {"access_token": token, "token_type": "bearer"}

FastAPI 的認證工具

什么是 Depends

Depends 是 FastAPI 中的依賴注入工具,用于在路由中動態(tài)引入邏輯。例如,可以通過它獲取登錄用戶的 Token,或者驗證 Token 的合法性。

什么是 OAuth2PasswordBearer

OAuth2PasswordBearer 是 FastAPI 提供的一個工具,幫助我們解析 Bearer Token。它會從請求頭的 Authorization 字段中提取 Token。

使用示例

from fastapi.security import OAuth2PasswordBeareroauth2_scheme = OAuth2PasswordBearer(tokenUrl="login")  # 指定獲取 Token 的登錄端點
  • 當(dāng)我們在路由中依賴 oauth2_scheme 時,它會自動解析 Token,并作為參數(shù)傳遞給路由函數(shù)。

實現(xiàn)受保護路由和 Token 驗證

我們在這里驗證 Token 的有效性,并返回用戶信息。

from fastapi import Dependsdef decode_jwt(token: str):"""驗證并解碼 JWT。"""try:payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])return payloadexcept jwt.ExpiredSignatureError:raise HTTPException(status_code=401, detail="令牌已過期")except jwt.InvalidTokenError:raise HTTPException(status_code=401, detail="令牌無效")@app.get("/protected")
async def protected_route(token: str = Depends(oauth2_scheme)):"""受保護的路由,需提供有效 JWT。"""payload = decode_jwt(token)username = payload.get("sub")if not username:raise HTTPException(status_code=401, detail="令牌無效")return {"message": f"歡迎回來,{username}!這是一個受保護的路由。"}
  1. 使用 /login 接口獲取 Token。
  2. 訪問 /protected,并在 Authorization 請求頭中添加 Bearer <your_token>。

優(yōu)化代碼結(jié)構(gòu)(解耦與擴展)

為了更好的維護和擴展,將用戶管理和 JWT 邏輯拆分到獨立模塊中。

# services/user_service.py
class UserService:"""用戶服務(wù)類:處理用戶驗證。"""def __init__(self):self.users_db = {"admin": "password123","user": "mypassword"}def authenticate(self, username: str, password: str) -> bool:"""驗證用戶名和密碼是否匹配。"""return self.users_db.get(username) == password
import jwt
import datetime
from fastapi import HTTPExceptionclass JWTHandler:"""JWT 工具類:負責(zé)生成和驗證 JWT。"""SECRET_KEY = "your_secret_key"ALGORITHM = "HS256"@staticmethoddef create_token(username: str) -> str:payload = {"sub": username,"exp": datetime.datetime.utcnow() + datetime.timedelta(hours=1)}return jwt.encode(payload, JWTHandler.SECRET_KEY, algorithm=JWTHandler.ALGORITHM)@staticmethoddef decode_token(token: str):try:return jwt.decode(token, JWTHandler.SECRET_KEY, algorithms=[JWTHandler.ALGORITHM])except jwt.ExpiredSignatureError:raise HTTPException(status_code=401, detail="令牌已過期")except jwt.InvalidTokenError:raise HTTPException(status_code=401, detail="令牌無效")
from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
from user_service import UserService
from jwt_handler import JWTHandlerapp = FastAPI()
user_service = UserService()
jwt_handler = JWTHandler()oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")@app.post("/login")
async def login(form_data:OAuth2PasswordRequestForm = Depends()):if not user_service.verify_user(form_data.username, form_data.password):raise HTTPException(status_code=401, detail="用戶名或密碼錯誤")token = jwt_handler.create_token(form_data.username)return {"access_token": token, "token_type": "bearer"}@app.get("/protected")
async def protected_route(token: str = Depends(oauth2_scheme)):payload = jwt_handler.decode_token(token)username = payload.get("sub")return {"message": f"歡迎回來,{username}!"}if __name__ == "__main__":import uvicornuvicorn.run(app, host="127.0.0.1", port=8000)

總結(jié)

通過本教程,你學(xué)會了:

  1. 基于 FastAPI 實現(xiàn)用戶登錄和 JWT Token 認證。
  2. 使用 DependsOAuth2PasswordBearer 實現(xiàn)認證邏輯。
  3. 解耦代碼結(jié)構(gòu),提升可擴展性。

可以進一步擴展功能,比如引入數(shù)據(jù)庫存儲用戶信息或添加刷新 Token 的機制。

http://www.risenshineclean.com/news/11394.html

相關(guān)文章:

  • 中國建設(shè)招標網(wǎng)住建部網(wǎng)站seo免費推廣軟件
  • 怎樣做p2p網(wǎng)站福建百度推廣
  • 網(wǎng)站正在建設(shè)中 英語翻譯seo體系百科
  • 群暉 nas 做網(wǎng)站自媒體平臺注冊官網(wǎng)
  • 網(wǎng)站建設(shè)初衷宣傳推廣網(wǎng)絡(luò)推廣
  • 西部數(shù)碼網(wǎng)站源碼正規(guī)的代運營公司
  • wordpress多站點無css百度推廣競價排名
  • wordpress允許游客支付seo流量是什么
  • 網(wǎng)站建設(shè)(中企動力)頂尖文案
  • 深圳網(wǎng)站設(shè)計公司電商培訓(xùn)機構(gòu)靠譜嗎
  • 漂亮的博客網(wǎng)站模板汕頭seo代理
  • 杭州 專業(yè)網(wǎng)站建設(shè) 網(wǎng)絡(luò)服務(wù)廣東疫情最新通報
  • 做公司網(wǎng)站的推廣工作怎樣成都私人網(wǎng)站制作
  • 做網(wǎng)站需要哪些軟件電商項目策劃書
  • 集約化網(wǎng)站建設(shè)淘寶推廣費用多少錢一天
  • 建網(wǎng)站wordpress百度推廣開戶公司
  • 長春做網(wǎng)站 長春萬網(wǎng)關(guān)鍵詞推廣操作
  • 做動態(tài)網(wǎng)站有什么較好的主題seo外貿(mào)公司推廣
  • 做電子的外單網(wǎng)站有哪些的交換友情鏈接平臺
  • 網(wǎng)站右下角彈出廣告代碼semantic scholar
  • 網(wǎng)站建設(shè)如何就接入支付寶推廣平臺app
  • 如何查看網(wǎng)站訪問日志文件網(wǎng)頁優(yōu)化公司
  • 通過云主機建設(shè)網(wǎng)站西安企業(yè)seo
  • 電影網(wǎng)站怎么做推廣公司做網(wǎng)絡(luò)推廣哪個網(wǎng)站好
  • 新翼設(shè)計網(wǎng)站建設(shè)公司精準信息預(yù)測
  • 成都市住房和城鄉(xiāng)建設(shè)委員會網(wǎng)站百度推廣怎么弄
  • asp.net動態(tài)網(wǎng)站開發(fā)崔寧宣傳推廣方案模板
  • 宜昌便宜做網(wǎng)站免費引流推廣
  • 深圳市住建局招標中心深圳關(guān)鍵詞排名seo
  • 沈陽企業(yè)網(wǎng)站建設(shè)品牌seo是什么