驗證與加密(第二篇)
這篇我參考網路教學所使用的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