PythonでJWT(JSON Web Token)を生成と検証する完全ガイド

この記事では、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の活用方法を考察しました。この知識を用いて、よりセキュアなアプリケーションを開発してみてください。

コメント

コメントする

目次