PythonでクラスとJWTを組み合わせて認証が必要なメソッドを保護するプログラムを作成する

スポンサーリンク

PythonでクラスとJWTを組み合わせて認証が必要なメソッドを保護するプログラムを作成してみます。

■Python

Google Colaboratory(Google Colab),2023年3月18日時点ではPython 3.9.16が用いられる。

なお、今回は事前にGoogle Colaboratory上にPyJWTをインストールしています。

■クラスとJWTを組み合わせて認証が必要なメソッドを保護するプログラムを作成する

では、早速クラスとJWTを組み合わせて認証が必要なメソッドを保護するプログラムを作成しますので、コードを書いていきます。

■コード

import jwt

class ProtectedClass:
  def __init__(self):
    self.secret_key = 'secret'
  def protected_method(self, token):
    try:
      decoded_token = jwt.decode(token, self.secret_key, algorithms=['HS256'])
      user_id = decoded_token['user_id']
      print(f"Access granted for user {user_id}")
    except jwt.exceptions.InvalidTokenError:
      print("Invalid token")

my_instance = ProtectedClass()

payload = {'user_id': "test_1"}
token = jwt.encode(payload, my_instance.secret_key, algorithm='HS256')

my_instance.protected_method(token)

まずは、importでjwtモジュールを呼び出します。

ProtectedClassというオブジェクトを作成するためのテンプレート(設計図)であるクラスを定義します。定義後、クラス内にdef文を用いて’__init__’と記述し、コンストラクタを使います。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。この時にself(自己)に対してドット演算子( . )を用いて「secret_key」を指定します。これで、最初の「self(自己)」という引数,パラメータを介して、「secret_key」というクラスのインスタンス変数が初期化され、値として’secret’が設定されます。(インスタンスが生成された時点で、JWTトークンの署名や検証に使用するための秘密鍵が設定。)

次にdef文を用いてprotected_method()というメソッドを定義します。括弧内には、メソッドで渡される最初の引数,パラメータは、インスタンス(作成されたオブジェクト)自体でなければならないため、「self(自己)」と記述し、最初の引数として渡します。次に第2の引数,パラメータとして「token」を渡します。このメソッドが呼び出された時の処理として、try-exceptを記述し例外処理を設定します。try節では、decoded_tokenという変数を定義し、その中でjwt.decode()を用います。これでトークンの署名を確認し、トークン クレームを返します。括弧内の第1の引数,パラメータはtoken変数、第2の引数,パラメータはself.secret_key(JWTトークンの署名や検証に使用するための秘密鍵)を渡します。そして第3の引数,パラメータはアルゴリズムを渡します(今回はHS256)。返されたトークンクレームはdecoded_token変数内に格納。

格納後、user_id変数を定義し、その中で角括弧”[ ]”を用いて、decoded_token内の「user_id」を抽出し、格納します。なお、decode()を用いてトークンで失敗した場合(jwt.exceptions.InvalidTokenError)は、except節の処理であるprint()で「Invalid token」が出力されます。

メソッドを定義後、my_instanceという変数を定義し、その中にProtectedClass()を格納し、インスタンス化を行います。インスタンス化によりオブジェクトが作成されたことで、クラス内にアクセスできるようになりました。インスタンス化された後に、payload変数を定義し、その中にidの情報を格納します。

格納後、token変数を定義し、その中でjwt.encode()を用います。括弧内の第1の引数,パラメータはpayload変数(ペイロード)、第2の引数,パラメータはmy_instance.secret_keyを渡します。そして第3の引数,パラメータはアルゴリズムを渡します(今回はHS256)。これでペイロードを JSON Web トークンとしてエンコードします。エンコードされたJSON Web トークンはtoken変数に格納。

最後に作成されたオブジェクトであるmy_instanceに対してドット演算子( . )を用いてprotected_method()を呼び出し、括弧内に引数,パラメータとしてtoken変数を渡します。これでトークンが有効であるかを判定し、有効である場合にのみアクセスを許可します。

■実行・検証

このコード(セル)を保存し、Google Colaboratory上で、セルを実行してみます。

実行してみると、ペイロードを設定し、JSON Web トークンを生成、生成されたトークンを作成したオブジェクトのprotected_method()を呼び出し、トークンが有効であるかどうかの判定を行うと「Access granted for user test_1」と出力されトークンが有効であることが確認できた。確認後、新たにtoken2変数を定義し、その中に偽のトークンを格納し、protected_method()の引数,パラメータとして渡してみたが「Invalid token」と出力され、トークンが有効でないことも格納できました。

コメント

タイトルとURLをコピーしました