p12(pkcs12)形式の証明書の有効期限をkeytoolとopensslで確認する
saratogax
サラトガ牧場
Python で JWT の文字列を base64 デコードしようとして、パディングのエラーになっていませんか?
本記事では、JWT からペイロード部分を抜き出し、正しくデコードできるようにパディングする方法を紹介します。
jwt のパッケージを使う手もありますが、ここではシンプルにベタ実装します。
同じ処理を Java と TypeScript で書いた記事もあります。


では早速、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)
コードを書かずに中身だけ手早く確認したいときは、ブラウザで動くデコーダーも用意しています。