/
test_jwt.py
35 lines (26 loc) · 1.23 KB
/
test_jwt.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
from pydantic import BaseModel
import jwt
from datetime import datetime
class JwtToken(BaseModel):
id: int
exp: int | datetime
iss: str
async def test_expected_same_token():
KEY = "SECRET"
ALGORITHM = "HS256"
json_token = {"id": 1, "exp": 1710152710, "iss": "kirimaru"}
pydantic_token = JwtToken(**json_token).model_dump()
# NOTE: JSON のキーの順番が違ってもTrue になる
assert json_token == pydantic_token
# NOTE: JWTの payload の順番が違ったら別のトークンになるのでソートしたら True になる
json_encode = jwt.encode(dict(sorted(json_token.items())), KEY, algorithm=ALGORITHM)
pydantic_encode = jwt.encode(
dict(sorted(pydantic_token.items())), KEY, algorithm=ALGORITHM
)
assert json_encode == pydantic_encode
# NOTE: ソートしなくても別のトークンから同じJSONに戻せることのチェック
json_encode = jwt.encode(json_token, KEY, algorithm=ALGORITHM)
pydantic_encode = jwt.encode(pydantic_token, KEY, algorithm=ALGORITHM)
json_decode = jwt.decode(json_encode, KEY, algorithms=ALGORITHM)
pydantic_decode = jwt.decode(pydantic_encode, KEY, algorithms=ALGORITHM)
assert json_decode == pydantic_decode