この記事では、PythonでJSON Web Token(JWT)を生成と検証する方法について詳しく解説します。実際に使用するコード例を交えながら、基本的な生成と検証の流れから応用例まで幅広く取り扱います。
JWT(JSON Web Token)とは
JSON Web Token(JWT)は、クレーム(claim)と呼ばれる情報をJSON形式でエンコードしたトークンです。このトークンは、通常認証や情報交換に使用されます。JWTは三つの部分からなり、それぞれヘッダ、ペイロード、署名です。
必要なライブラリのインストール
PythonでJWTを扱うためには、「PyJWT」ライブラリをインストールする必要があります。
pip install PyJWT
基本的なJWTの生成
import jwt
# 秘密鍵
secret = "my_secret_key"
# ペイロード(クレーム)
payload = {
"user_id": 1,
"username": "john_doe",
}
# JWT生成
encoded_jwt = jwt.encode(payload, secret, algorithm="HS256")
# 生成したJWTを出力
print(encoded_jwt)
コード解説
1. `jwt`ライブラリをインポートします。
2. `secret`には秘密鍵を設定します。このキーはJWTの署名に使われます。
3. `payload`にはトークンに含める情報(クレーム)を設定します。
4. `jwt.encode()`関数でJWTを生成します。第一引数にペイロード、第二引数に秘密鍵、第三引数にアルゴリズムを指定します。
5. 生成したJWTを出力します。
基本的なJWTの検証
# JWT検証
try:
decoded_jwt = jwt.decode(encoded_jwt, secret, algorithms=["HS256"])
print(decoded_jwt)
except jwt.InvalidTokenError:
print("無効なトークンです")
コード解説
1. `jwt.decode()`関数でJWTを検証します。第一引数に検証するJWT、第二引数に秘密鍵、第三引数にアルゴリズムを指定します。
2. 検証に成功するとデコードされたペイロードが返されます。
3. トークンが無効な場合は`jwt.InvalidTokenError`が発生します。
応用例1: 有効期限を設定する
import datetime
# 有効期限を1時間後に設定
payload["exp"] = datetime.datetime.utcnow() + datetime.timedelta(hours=1)
# JWT生成
encoded_jwt_with_exp = jwt.encode(payload, secret, algorithm="HS256")
コード解説
ペイロードに`exp`(expire)フィールドを追加し、その値に有効期限を設定します。有効期限が過ぎたトークンは、`jwt.decode()`でエラーとなります。
応用例2: カスタムクレームを使用する
# カスタムクレームを追加
payload["role"] = "admin"
# JWT生成
encoded_jwt_with_role = jwt.encode(payload, secret, algorithm="HS256")
コード解説
ペイロードに`role`というカスタムクレームを追加します。これにより、トークンからユーザーの権限などを判断することができます。
まとめ
この記事では、PythonでJWTを生成と検証する方法を解説しました。基本的な使い方から応用例まで、多角的にJWTの活用方法を考察しました。この知識を用いて、よりセキュアなアプリケーションを開発してみてください。
コメント