首頁  >  文章  >  後端開發  >  如何在FastAPI中使用JWT令牌進行身份驗證和授權

如何在FastAPI中使用JWT令牌進行身份驗證和授權

PHPz
PHPz原創
2023-08-01 14:21:202802瀏覽

如何在FastAPI中使用JWT令牌進行身份驗證和授權

簡介:
隨著Web應用程式的發展,使用者身份驗證和授權成為了至關重要的部分。使用JWT(JSON Web Token)令牌可以輕鬆實現身份驗證和授權功能。 FastAPI是一個基於Python的現代Web框架,它提供了簡單易用的功能來處理身份驗證和授權。本文將介紹如何在FastAPI中使用JWT令牌進行身份驗證和授權。

  1. 安裝依賴函式庫
    首先,我們需要安裝一些依賴函式庫,包括FastAPI、PyJWT和Passlib。可以使用pip指令進行安裝:
pip install fastapi
pip install pyjwt
pip install passlib
  1. #產生秘密金鑰
    我們需要產生一個用於簽署和驗證JWT令牌的秘金鑰。可以使用以下程式碼產生秘鑰:
import secrets

secret_key = secrets.token_urlsafe(32)
  1. 建立使用者模型
    在FastAPI中,我們需要定義一個使用者模型來表示應用程式中的使用者。可以使用以下程式碼建立使用者模型:
from pydantic import BaseModel

class User(BaseModel):
    username: str
    password: str
  1. #建立路由和處理函數
    接下來,我們需要建立路由和處理函數來處理使用者的驗證和授權請求。可以使用以下程式碼建立路由和處理函數:
from fastapi import FastAPI, HTTPException
from fastapi.security import HTTPBearer, HTTPAuthorizationCredentials
from passlib.context import CryptContext
from datetime import datetime, timedelta
import jwt

app = FastAPI()

pwd_context = CryptContext(schemes=["bcrypt"])
security = HTTPBearer()

# 模拟数据库中的用户
users_db = {
    "admin": {
        "username": "admin",
        "password": pwd_context.hash("admin123")
    }
}

@app.post("/login")
def login(user: User):
    if user.username not in users_db:
        raise HTTPException(status_code=401, detail="Invalid username")
    
    stored_user = users_db[user.username]
    if not pwd_context.verify(user.password, stored_user["password"]):
        raise HTTPException(status_code=401, detail="Invalid password")
    
    token = generate_token(user.username)
    return {"access_token": token}

def generate_token(username: str) -> str:
    expiration = datetime.utcnow() + timedelta(minutes=30)
    payload = {"username": username, "exp": expiration}
    return jwt.encode(payload, secret_key, algorithm="HS256")

@app.get("/users/me")
def get_user_profile(credentials: HTTPAuthorizationCredentials = security):
    token = credentials.credentials
    try:
        payload = jwt.decode(token, secret_key, algorithms=["HS256"])
        username = payload["username"]
        if username not in users_db:
            raise HTTPException(status_code=401, detail="Invalid username")
        
        return {"username": username}
    except jwt.DecodeError:
        raise HTTPException(status_code=401, detail="Invalid token")
  1. 測試功能
    現在,我們可以使用Postman或其他HTTP客戶端工具來測試我們的功能。首先,我們需要使用POST請求發送登入請求,並在請求體中包含使用者名稱和密碼。如下所示:

請求網址:http://localhost:8000/login
請求體:

{
    "username": "admin",
    "password": "admin123"
}

成功登入後,我們將收到一個包含存取令牌的響應。例如:

{
    "access_token": "xxxxxxxxxxxxx"
}

然後,我們可以使用GET請求發送獲取使用者資料的請求,將存取權杖作為Authorization頭部的Bearer令牌發送。如下所示:

請求URL:http://localhost:8000/users/me
#請求頭部:Authorization: Bearer xxxxxxxxxxxxx

如果令牌驗證成功,回應將傳回一個包含使用者名稱的JSON物件。例如:

{
    "username": "admin"
}

結束語:
本文介紹如何在FastAPI中使用JWT令牌進行身份驗證和授權。透過使用PyJWT函式庫,我們產生了JWT令牌,並使用Passlib函式庫進行密碼雜湊驗證。使用這種方法,我們可以輕鬆地實現使用者身份驗證和授權功能,從而保護我們的網路應用程式。

以上是如何在FastAPI中使用JWT令牌進行身份驗證和授權的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn