wgetでリクエストヘッダを指定して通信を行う
saratogax
サラトガ牧場
過去に Java や TypeScript で JWT 文字列の解析を行いました。
今回は Python でデコードする機会があったのですが、base64 文字列をパディングするケースが必要に。
言語によって文字列操作は様々ですが、Python ではどんな方法がベターなのでしょうか。
jwt のパッケージをインポートして使うのが早そうですが、今回はシンプルにベタ実装してみましょう。
では早速、JWT の文字列から ペイロード(payload)部分を抜き出す方法を紹介します。
今回は base64 と json を扱うので、以下の 2 つのライブラリを使用します。
import base64
import json
JWT の文字列はドットで区切られているので、まずはここを分解。
jwtstr=’aaa.bbb.ccc’
jwtstrs=jwtstr.split(‘.’)
payload=jwtstrs[1]
これでペイロード部分が抜き出せますが、文字列によってはそのまま base64 デコードはできない状態に。
そこで、足りない部分をイコール(ゲタ文字)でパディングしてあげましょう。
まずは payload の文字数を 4 で割って余りを取得。
4 からその余りを引いて、足りない文字数(0から3)を補ってあげます。
payload += ‘=’ * (4 – (len(payload) % 4))
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)