Skip to content
On this page

驗證與加密(第二篇)

這篇我參考網路教學所使用的PyJWT模組來製作認證,我是覺得比上一篇好理解,操作也比較簡潔。

環境需求

  • pyjwt
cmd
pip install pyjwt

先前預備

進行加密的key code可以跟著第一篇使用openssl來創建亂數。

開始編譯

自建一組帳號與密碼,與第一篇一樣,通常是存放在資料庫中。

py
# main.py
fake_users_db = {
    "username": "evanhsiao",
    "password": "123456abcdefg",
}

增加一組設定自己想加密的key code。

py
# main.py
import jwt

SECRET_KEY = "evanhsiaos123456789"
ALGORITHM = "HS256"
ACCESS_TOKEN_EXPIRE_MINUTES = 800

一樣採用BaseModel驗證輸入格式

py
from pydantic import BaseModel

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

來個驗證

這裡加密採用FastAPI內建的jsonable_encoder

py
# main.py
from fastapi.encoders import jsonable_encoder

@app.post("/login")
async def login_user(login_item: Loginclass):
    # 透過jsonable_encoder來驗證
    data = jsonable_encoder(login_item)
    # 比對輸入內容
    if fake_users_db['username'] == data['username'] /
        and fake_users_db['password'] == data['password']:
        # 通過時顯示內容
        encoded_jwt = jwt.encode(data, SECRET_KEY, algorithm=ALGORITHM)
        return {'token': encoded_jwt }
    else:
        # 未通過顯示的內容
        return {'message': 'Login failed'}

就這樣完成簡單的驗證效果,比官方少很多作法,不過安全性尚待確認,至少對於資料加密有一番認知,期待後面有其他知識吸收,可以再進化加密驗證方式。

下方也是另一種寫法:

py
import jwt
from fastapi import FastAPI, Header
from pydantic import BaseModel
from typing import Optional

# 自定義字串
JWT_SECRET = "evanhsiaos123456789"
JWT_ALGORITHM = "HS256"

app = FastAPI()

# 先編列要驗證的欄位、格式
class Person(BaseModel):
    name: str
    gender: Optional[str] = None
    age: float
    checked: Optional[bool] = None


@app.post("/")
async def root(person: Person, authorization: str = Header(None)):
    try:
        # 呼叫下方函式
        decoded = secure(authorization)
    except:
        # 未經授權時
        return "Unauthorized Access!"
    person.checked = True
    return person    

# 定義安全函式
def secure(token):    
    # 使用jwt解碼(輸入的密碼token,自定義字串JWT_SECRET,演算法JWT_ALGORITHM)
    decoded_token = jwt.decode(token, JWT_SECRET, algorithms=JWT_ALGORITHM)
    return decoded_token

參考