技術系TIPS
PR

【Python版】JWTのパースでbase64デコードできるようにパディングする

saratogax
記事内に商品プロモーションを含む場合があります

過去に Java や TypeScript で JWT 文字列の解析を行いました。

あわせて読みたい
【TypeScript版】CognitoのIDトークンのJWT検証
【TypeScript版】CognitoのIDトークンのJWT検証
あわせて読みたい
【Java版】CognitoのIDトークンのJWT検証とダミートークンの作成
【Java版】CognitoのIDトークンのJWT検証とダミートークンの作成

今回は Python でデコードする機会があったのですが、base64 文字列をパディングするケースが必要に。

言語によって文字列操作は様々ですが、Python ではどんな方法がベターなのでしょうか。

jwt のパッケージをインポートして使うのが早そうですが、今回はシンプルにベタ実装してみましょう。

では早速、JWT の文字列から ペイロード(payload)部分を抜き出す方法を紹介します。

なお、この記事ではヘッダのアルゴリズムは HS256 とし、署名のチェックを省略します。

必要なパッケージのインポート

今回は base64 と json を扱うので、以下の 2 つのライブラリを使用します。

import base64
import json

JWT文字列のパース

JWT の文字列はドットで区切られているので、まずはここを分解。

jwtstr=’aaa.bbb.ccc’

jwtstrs=jwtstr.split(‘.’)
payload=jwtstrs[1]

これでペイロード部分が抜き出せますが、文字列によってはそのまま base64 デコードはできない状態に。

そこで、足りない部分をイコール(ゲタ文字)でパディングしてあげましょう。

まずは payload の文字数を 4 で割って余りを取得。

4 からその余りを引いて、足りない文字数(0から3)を補ってあげます。

payload += ‘=’ * (4 – (len(payload) % 4))

base64デコード

payload が抜き出せて、パディングもできたら、あとは base64 でデコードしてあげましょう。

decodePayload=base64.urlsafe_b64decode(payload)

結果を確認して、さらに JSON への変換を行えばバッチリですね。

print(decodePayload)

jsonPayload=json.loads(decodePayload)
print(jsonPayload)

まとめ

最後に参考ソースを貼っておきます。

バリデーションなど、細かな処理は省略しています。

import base64
import json

jwtstr='aaa.bbb.ccc'

jwtstrs=jwtstr.split('.')
payload=jwtstrs[1]

payload += '=' * (4 - (len(payload) % 4))
decodePayload=base64.urlsafe_b64decode(payload)

print(decodePayload)

jsonPayload=json.loads(decodePayload)

print(jsonPayload)
ABOUT ME
saratoga
saratoga
フリーランスエンジニア
仕事にも趣味にも IT を駆使するフリーランスエンジニア。技術的な TIPS や日々の生活の中で深堀りしてみたくなったことを備忘録として残していきます。
記事URLをコピーしました