🔑

Python:JOSE・JWTライブラリを列挙する.

2024/10/17に公開

はじめに

  • 2024年10月19日現在,使用可能なJOSE・JWTのpythonライブラリを調べてみました.

  • 動機・目的

    • pythonでpem形式の証明書からjwksを生成するプロフラムを実装したく,使えそうなライブラリを探したかった.

    • 元々PyJWTを利用しており,他にも同等のライブラリがあるのかどうか気になった.

※スター数が少なく人気がなさそうなライブラリは,省いています

PyJWT

  • JWTのエンコード・デコード機能が実装されている.URLを引数として,jwk(s)を取り出すJWKClientクラスが実装している.
  • ドキュメント(簡単な例があってみやすい)

https://pyjwt.readthedocs.io/en/stable/#

  • GitHub(スター数:約5100)

https://github.com/jpadilla/pyjwt?tab=readme-ov-file

JWCrypto

  • JWK,JWS,JWE,JWTの仕様を実装している.
  • ドキュメント(字が多くてちょっと見にくい.けど,メソッド名や引数,返り値等の記載が盛り込まれており,情報量が多い)

https://jwcrypto.readthedocs.io/en/latest/index.html

  • JWTの署名生成および検証時に使う鍵は,同ライブラリのJWKクラスのインスタンスであり,相互性関連性が強い.

https://jwcrypto.readthedocs.io/en/latest/jwt.html#examples

  • GitHub(スター数:435)

https://github.com/latchset/jwcrypto

  • OpenWallet Foundationと呼ばれる組織が実装しているsd(Selective Disclosure:選択的開示機能)-jwtには,このライブラリが使用されている.

https://github.com/openwallet-foundation-labs/sd-jwt-python/blob/main/src/sd_jwt/issuer.py

python-jose

This library was originally based heavily on the work of the folks over at PyJWT.

  • ドキュメント(情報量が少ない)

https://python-jose.readthedocs.io/en/latest/

  • JWCryptoと後述のAuthlibには実装されてるthumbprint(jwkのハッシュ値. jwkのkidとしても設定できる)生成のメソッドがない.

issueでthumbprint実装して欲しい旨の投稿があるものの、未実装.

https://github.com/mpdavis/python-jose/issues/276

  • GitHub(スター数:約1500)

https://github.com/mpdavis/python-jose

Authlib

This project is inspired by:
OAuthLib
Flask-OAuthlib
requests-oauthlib
pyjwt

  • JWTの署名検証を行う際,検証鍵(公開鍵)はpem形式のデータを想定しており,同ライブラリのJWKインスタンスを使用できない.

  • ドキュメント(見やすい.)

https://docs.authlib.org/en/latest/

  • GitHub(スター数:約4500)

https://github.com/lepture/authlib

コメント

  • pem形式の公開鍵データからjson形式のjwkファイルを生成したり,jwkのjsonファイルを用いて対象のJWTを検証する機能や実装が必要な場合,メソッドが豊富なJWCryptoのほうを使った方がいいだろう.JWCryptoのjwkクラスは,pem形式のデータからjwkインスタンスを生成したり,jsonデータをエクスポートできたりする.また,JWTの検証もAuthlibとは異なり,jwkクラスのインスタンスをそのまま使用できる(pem形式のデータに直したりする必要がない)

  • 逆に,ここで列挙したJWCrypto以外のライブラリを使う場合,前者(pem⇨json型jwk生成)か後者(jwkのjsonファイルを用いて,jwtの署名検証)どちらかの処理に関して,自作でなにかしらの手順を行うコードの作成が必要となる.

    • 例:Authlib:jwk.jsonからpem形式の公開鍵データを生成する手順がないと,jwtの検証に移ることができない.

Discussion