FastAPI 安全機制(二) 基於OAuth2和JWT的Token認證機制(一)生成token
阿新 • • 發佈:2020-07-01
作者:麥克煎蛋 出處:https://www.cnblogs.com/mazhiyong/ 轉載請保留這段宣告,謝謝!
JWT簡介
OAuth2PasswordBearer
OAuth2PasswordBearer
是接收URL作為引數的一個類:客戶端會向該URL傳送username
和password
引數,然後得到一個token值。
OAuth2PasswordBearer
並不會建立相應的URL路徑操作,只是指明瞭客戶端用來獲取token的目標URL。
當請求到來的時候,FastAPI會檢查請求的Authorization
頭資訊,如果沒有找到Authorization
頭資訊,或者頭資訊的內容不是Bearer
token,它會返回401狀態碼(UNAUTHORIZED
)。
我們需要安裝PyJWT
來產生和校驗JWT token。
pip install pyjwt
我們也需要安裝python-multipart
,因為OAuth2需要通過表單資料來發送username
和password
資訊。
pip install python-multipart
獲取token的程式碼示例如下:
from datetime import datetime, timedelta from typing import Optionalfrom fastapi import Depends, FastAPI from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm import jwt from pydantic import BaseModel # to get a string like this run: # openssl rand -hex 32 SECRET_KEY = "09d25e094faa6ca2556c818166b7a9563b93f7099f6f0f4caa6cf63b88e8d3e7" ALGORITHM = "HS256" ACCESS_TOKEN_EXPIRE_MINUTES = 30 class Token(BaseModel): access_token: str token_type: str app = FastAPI() # oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/token")
# 生成token def create_access_token(data: dict, expires_delta: Optional[timedelta] = None): to_encode = data.copy() if expires_delta: expire = datetime.utcnow() + expires_delta else: expire = datetime.utcnow() + timedelta(minutes=15) to_encode.update({"exp": expire}) encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM) return encoded_jwt
# 請求介面 @app.post("/token", response_model=Token) async def login_for_access_token(form_data: OAuth2PasswordRequestForm = Depends()): access_token_expires = timedelta(minutes=ACCESS_TOKEN_EXPIRE_MINUTES) access_token = create_access_token( data={"sub": "test"}, expires_delta=access_token_expires ) return {"access_token": access_token, "token_type": "bearer"}
我們可以通過postman或者互動式文件來測試這個介面。
如果單純作為API使用來獲取token值,下面這行程式碼暫時是用不到的:
# oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/token")