最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

PyJWT實現(xiàn)Token驗證

 更新時間:2025年04月28日 10:07:55   作者:T0uken  
Python 的?PyJWT?是一個流行的庫,用于處理 JWT,本文主要介紹了PyJWT實現(xiàn)Token驗證,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

JSON Web Token (JWT) 是一種基于 JSON 格式的輕量級的安全令牌,通常用于身份驗證和信息交換。Python 的 PyJWT 是一個流行的庫,用于處理 JWT。本文將從零開始,帶你逐步學(xué)習(xí) PyJWT 的基本用法、原理以及進(jìn)階功能。

什么是 JWT

JWT 的組成

JWT 是由三部分組成的字符串:

  • Header(頭部):聲明類型和簽名算法。
  • Payload(載荷):存儲數(shù)據(jù)(通常是用戶信息或聲明)。
  • Signature(簽名):對 Header 和 Payload 進(jìn)行簽名,確保數(shù)據(jù)未被篡改。

它們通過 . 分隔,整體形式為:

Header.Payload.Signature

例如:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoxMjMsIm5hbWUiOiJKb2UiLCJyb2xlIjoiYWRtaW4ifQ.4zUHL8hfXX8E8OomNQByT3MHnfoyQh27-8r1ZjXv9Fo

JWT 的工作流程

  • 生成令牌:用戶登錄時,服務(wù)器驗證用戶身份,并生成 JWT。
  • 攜帶令牌:JWT 通常通過 HTTP Header 的 Authorization 字段傳遞。
  • 驗證令牌:服務(wù)器收到請求后,驗證 JWT 的簽名是否有效,確認(rèn)信息是否未被篡改。

安裝 PyJWT

在開始使用 PyJWT 之前,先安裝它:

pip install PyJWT

生成 JWT

創(chuàng)建簡單的 JWT

下面是如何使用 PyJWT 生成一個簡單的 JWT:

import jwt
import datetime

# 定義密鑰和算法
SECRET_KEY = "your_secret_key"
ALGORITHM = "HS256"

# 生成 JWT
payload = {
    "user_id": 123,
    "name": "John Doe",
    "role": "admin",
    "exp": datetime.datetime.utcnow() + datetime.timedelta(hours=1)  # 設(shè)置過期時間
}

token = jwt.encode(payload, SECRET_KEY, algorithm=ALGORITHM)
print("Generated JWT:", token)

代碼說明:

  • payload 是載荷,其中 exp 是過期時間。
  • jwt.encode 用于生成 JWT。

解碼 JWT

要解碼生成的 JWT 并查看數(shù)據(jù):

decoded_payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
print("Decoded Payload:", decoded_payload)

檢查過期時間

如果令牌過期,會拋出 jwt.ExpiredSignatureError 異常:

try:
    decoded_payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
    print("Decoded Payload:", decoded_payload)
except jwt.ExpiredSignatureError:
    print("Token has expired!")

JWT 的簽名和驗證

PyJWT 支持多種算法,如:

  • 對稱算法:HS256HS384HS512
  • 非對稱算法:RS256ES256

對稱加密

對稱加密使用單一密鑰簽名和驗證:

# 對稱加密簽名
token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")

# 驗證簽名
decoded_payload = jwt.decode(token, SECRET_KEY, algorithms=["HS256"])

非對稱加密

非對稱加密使用公鑰和私鑰。示例:

  • 生成密鑰(假設(shè)已有 RSA 密鑰對)。

  • 簽名和驗證:

    private_key = open("private_key.pem").read()
    public_key = open("public_key.pem").read()
    
    # 使用私鑰簽名
    token = jwt.encode(payload, private_key, algorithm="RS256")
    
    # 使用公鑰驗證
    decoded_payload = jwt.decode(token, public_key, algorithms=["RS256"])
    

高級功能

自定義聲明

除了標(biāo)準(zhǔn)聲明(如 exp、iat),你可以添加自定義字段:

payload = {
    "user_id": 123,
    "role": "editor",
    "permissions": ["read", "write"],
    "iat": datetime.datetime.utcnow(),  # 簽發(fā)時間
    "exp": datetime.datetime.utcnow() + datetime.timedelta(days=1)  # 過期時間
}
token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")

設(shè)置過期時間

exp 是 JWT 的標(biāo)準(zhǔn)聲明,用于指定過期時間。

payload = {
    "user_id": 123,
    "exp": datetime.datetime.utcnow() + datetime.timedelta(minutes=15)
}

令牌刷新

令牌刷新可以延長用戶登錄會話時間:

# 原令牌
token = jwt.encode(payload, SECRET_KEY, algorithm="HS256")

# 解碼并刷新
decoded = jwt.decode(token, SECRET_KEY, algorithms=["HS256"], options={"verify_exp": False})
decoded["exp"] = datetime.datetime.utcnow() + datetime.timedelta(minutes=15)

# 生成新令牌
refreshed_token = jwt.encode(decoded, SECRET_KEY, algorithm="HS256")

常見錯誤及解決方法

Token 已過期

錯誤信息:jwt.ExpiredSignatureError

解決方法:在 jwt.decode 時捕獲異常。

try:
    decoded_payload = jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
except jwt.ExpiredSignatureError:
    print("Token has expired!")

簽名驗證失敗

錯誤信息:jwt.InvalidSignatureError

解決方法:確保簽名密鑰正確,并使用相同的算法。

實戰(zhàn):JWT 身份驗證示例

以下是一個基于 Fastapi的示例,實現(xiàn)用戶登錄和令牌驗證:

from fastapi import FastAPI, Depends, HTTPException
from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm
import jwt
import datetime
from typing import Dict, Optional

# ==========================
# 配置和常量
# ==========================
SECRET_KEY = "your_secret_key"  # JWT 密鑰
ALGORITHM = "HS256"            # JWT 算法
TOKEN_EXPIRE_HOURS = 1         # 令牌有效時間(小時)

# OAuth2PasswordBearer 定義,用于獲取用戶的令牌
oauth2_scheme = OAuth2PasswordBearer(tokenUrl="token")


# ==========================
# 用戶服務(wù)類
# ==========================
class UserService:
    """
    用戶服務(wù)類:負(fù)責(zé)用戶身份驗證和管理
    """
    def __init__(self):
        # 模擬數(shù)據(jù)庫:用戶名和密碼
        self.users_db = {
            "admin": "password123",
            "user": "mypassword"
        }

    def authenticate(self, username: str, password: str) -> bool:
        """
        驗證用戶名和密碼是否匹配
        :param username: 用戶名
        :param password: 密碼
        :return: 驗證是否成功
        """
        return self.users_db.get(username) == password


# ==========================
# JWT 工具類
# ==========================
class JWTHandler:
    """
    JWT 工具類:負(fù)責(zé)生成和驗證 JWT
    """
    @staticmethod
    def create_token(username: str, expire_hours: int = TOKEN_EXPIRE_HOURS) -> str:
        """
        生成 JWT
        :param username: 用戶名
        :param expire_hours: 令牌有效時間
        :return: 生成的 JWT 字符串
        """
        payload = {
            "sub": username,  # 聲明主體
            "exp": datetime.datetime.utcnow() + datetime.timedelta(hours=expire_hours)  # 過期時間
        }
        return jwt.encode(payload, SECRET_KEY, algorithm=ALGORITHM)

    @staticmethod
    def verify_token(token: str) -> Optional[Dict]:
        """
        驗證 JWT 并解碼
        :param token: JWT 字符串
        :return: 解碼后的 Payload,如果無效則返回 None
        """
        try:
            return jwt.decode(token, SECRET_KEY, algorithms=[ALGORITHM])
        except jwt.ExpiredSignatureError:
            raise HTTPException(status_code=401, detail="令牌已過期")
        except jwt.InvalidTokenError:
            raise HTTPException(status_code=401, detail="令牌無效")


# ==========================
# 依賴注入類
# ==========================
class Dependencies:
    """
    依賴注入類,用于解耦依賴
    """
    def __init__(self, user_service: UserService, jwt_handler: JWTHandler):
        self.user_service = user_service
        self.jwt_handler = jwt_handler

    def authenticate_user(self, form_data: OAuth2PasswordRequestForm) -> str:
        """
        驗證用戶并生成 JWT
        :param form_data: 用戶提交的表單數(shù)據(jù)(包含用戶名和密碼)
        :return: JWT
        """
        username = form_data.username
        password = form_data.password
        if not self.user_service.authenticate(username, password):
            raise HTTPException(status_code=401, detail="用戶名或密碼錯誤")
        return self.jwt_handler.create_token(username)

    def validate_token(self, token: str) -> str:
        """
        驗證 Token 并返回用戶名
        :param token: JWT
        :return: 解碼后的用戶名
        """
        payload = self.jwt_handler.verify_token(token)
        username = payload.get("sub")
        if not username:
            raise HTTPException(status_code=401, detail="無效的令牌")
        return username


# ==========================
# 創(chuàng)建 FastAPI 應(yīng)用
# ==========================
app = FastAPI()

# 實例化服務(wù)類
user_service = UserService()
jwt_handler = JWTHandler()
dependencies = Dependencies(user_service, jwt_handler)


# ==========================
# 路由定義
# ==========================
@app.post("/token")
async def login(form_data: OAuth2PasswordRequestForm = Depends()):
    """
    登錄接口:驗證用戶并返回 Token
    :param form_data: FastAPI 提供的 OAuth2PasswordRequestForm
    :return: 包含 Token 的 JSON
    """
    token = dependencies.authenticate_user(form_data)
    return {"access_token": token, "token_type": "bearer"}


@app.get("/protected")
async def protected(token: str = Depends(oauth2_scheme)):
    """
    受保護(hù)的接口:需要提供有效 Token 才能訪問
    :param token: OAuth2PasswordBearer 自動提取的 JWT
    :return: 歡迎信息
    """
    username = dependencies.validate_token(token)
    return {"message": f"歡迎回來,{username}!您的訪問已被授權(quán)。"}


# ==========================
# 主程序入口(僅調(diào)試使用)
# ==========================
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="127.0.0.1", port=8000)

代碼說明

  • FastAPI 的 OAuth2PasswordBearer
    • OAuth2PasswordBearer 是 FastAPI 提供的工具,用于從請求頭中自動提取和驗證 Bearer 類型的 Token。
    • 通過 Depends(oauth2_scheme) 可以在路由中輕松獲取 Token。
  • JWT 生成和解碼
    • 使用 jwt.encode 生成包含用戶信息的 JWT。
    • 使用 jwt.decode 驗證和解碼 JWT,并處理可能的異常,如令牌過期或無效。
  • 路由說明
    • /token:用于登錄,驗證用戶名和密碼,返回 Token。
    • /protected:受保護(hù)的接口,只有提供有效 Token 的用戶才能訪問。
  • 錯誤處理
    • 如果用戶的用戶名或密碼錯誤,會返回 401 錯誤。
    • 如果 Token 無效或過期,也會返回 401 錯誤。

測試流程

  • 安裝依賴 確保安裝了 fastapi 和 uvicorn

    pip install fastapi uvicorn PyJWT
    
  • 啟動服務(wù) 運行代碼后,訪問 http://127.0.0.1:8000/docs 打開 FastAPI 自動生成的 API 文檔頁面。

  • 測試接口

    • 登錄接口 使用 /token,提交用戶名和密碼獲取 Token。
    • 受保護(hù)接口 使用 /protected,在請求頭中添加 Authorization: Bearer <token> 來訪問。

總結(jié)

在這篇文章中,我們深入探討了 JSON Web Token(JWT)的基本原理,尤其是如何使用 PyJWT 庫來生成、解碼和驗證令牌。我們首先了解了 JWT 的工作機(jī)制,并學(xué)習(xí)了簽名算法及其進(jìn)階功能,以確保令牌的安全性和可靠性。此外,我們還討論了一些常見問題及其解決方法,以便幫助你更好地應(yīng)對這些在實際應(yīng)用中可能遇到的挑戰(zhàn)。最后,我們通過一個完整的 JWT 身份驗證實例,將理論與實踐相結(jié)合,希望能為你的項目提供有價值的參考。掌握這些內(nèi)容后,你將能夠靈活地在自己的 Web 應(yīng)用中應(yīng)用 JWT,提升系統(tǒng)的安全性和用戶體驗。

到此這篇關(guān)于PyJWT實現(xiàn)Token驗證的文章就介紹到這了,更多相關(guān)PyJWT Token驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python Pandas實現(xiàn)DataFrame合并的圖文教程

    Python Pandas實現(xiàn)DataFrame合并的圖文教程

    我們在使用pandas處理數(shù)據(jù)的時候,往往會需要合并兩個或者多個DataFrame的操作,下面這篇文章主要給大家介紹了關(guān)于Pandas實現(xiàn)DataFrame合并的相關(guān)資料,需要的朋友可以參考下
    2022-07-07
  • python flask服務(wù)端響應(yīng)與重定向處理各種用法小結(jié)

    python flask服務(wù)端響應(yīng)與重定向處理各種用法小結(jié)

    這篇文章主要介紹了python flask服務(wù)端響應(yīng)與重定向處理各種用法小結(jié),本文通過實例圖文相結(jié)合給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-03-03
  • 使用python實現(xiàn)將excel數(shù)據(jù)導(dǎo)入word并設(shè)置字體樣式的代碼示例

    使用python實現(xiàn)將excel數(shù)據(jù)導(dǎo)入word并設(shè)置字體樣式的代碼示例

    在日常辦公和數(shù)據(jù)處理中,我們經(jīng)常需要將Excel中的數(shù)據(jù)導(dǎo)入到Word文檔中,手動完成這個過程可能既費時又容易出錯,本文將介紹如何使用Python自動化這一任務(wù),需要的朋友可以參考下
    2024-02-02
  • Python列表解析操作實例總結(jié)

    Python列表解析操作實例總結(jié)

    這篇文章主要介紹了Python列表解析操作,結(jié)合實例形式總結(jié)分析了Python列表解析常見的列表推導(dǎo)式、循環(huán)語句、條件列表、嵌套列表等相關(guān)操作技巧,需要的朋友可以參考下
    2020-02-02
  • Python作用域與名字空間源碼學(xué)習(xí)筆記

    Python作用域與名字空間源碼學(xué)習(xí)筆記

    這篇文章主要為大家介紹了Python作用域與名字空間的源碼學(xué)習(xí)筆記,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>
    2022-05-05
  • 手把手教你用python繪制熱度圖(heatmap)

    手把手教你用python繪制熱度圖(heatmap)

    我們在做諸如人群密集度等可視化的時候,可能會考慮使用熱力圖,在Python中能很方便地繪制熱力圖,下面這篇文章主要給大家介紹了關(guān)于用python繪制熱度圖(heatmap)的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • Python實現(xiàn)圖片轉(zhuǎn)字符畫的示例代碼

    Python實現(xiàn)圖片轉(zhuǎn)字符畫的示例代碼

    本篇文章主要介紹了Python實現(xiàn)圖片轉(zhuǎn)字符畫的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • win10系統(tǒng)下python3安裝及pip換源和使用教程

    win10系統(tǒng)下python3安裝及pip換源和使用教程

    這篇文章主要介紹了win10系統(tǒng)下python3安裝及pip換源和使用教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-01-01
  • matplotlib共享坐標(biāo)軸的實現(xiàn)(X或Y坐標(biāo)軸)

    matplotlib共享坐標(biāo)軸的實現(xiàn)(X或Y坐標(biāo)軸)

    在作圖的過程中,我們經(jīng)常會遇到子圖共用坐標(biāo)軸的情況,或是共用橫軸標(biāo)軸,也可能是縱坐標(biāo)軸。本文就介紹了matplotlib共享坐標(biāo)軸,感興趣的可以了解一下
    2021-05-05
  • Windows和Linux下Python輸出彩色文字的方法教程

    Windows和Linux下Python輸出彩色文字的方法教程

    這篇文章主要介紹了在Windows和Linux中Python輸出彩色文字的方法,通過設(shè)置彩色文字給大家更醒目的效果,文中給出了詳細(xì)的介紹和示例代碼,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-05-05

最新評論

胶州市| 玉林市| 筠连县| 黑水县| 花垣县| 临洮县| 托克托县| 湄潭县| 湄潭县| 北海市| 遂平县| 承德县| 娱乐| 水城县| 万盛区| 大丰市| 囊谦县| 洪雅县| 同江市| 安康市| 吉安市| 游戏| 汶川县| 蛟河市| 双柏县| 房山区| 黄浦区| 乐昌市| 青海省| 永定县| 松滋市| 屏山县| 轮台县| 沧源| 葫芦岛市| 阳春市| 临澧县| 惠来县| 衡阳县| 嫩江县| 昔阳县|