LoginSignup
4
8

More than 1 year has passed since last update.

PythonによるJWTの実装入門

Last updated at Posted at 2022-10-31

そもそもJWTとは?

【JWT】 入門
この記事がわかりやすかったので参考までに

・API認証やアクセス制御などで用いられる規格の一つ。
・公開鍵暗号に基づくメッセージ認証コードにより改ざんやなりすましを防ぐ。
・JWT(JSON Web Token)でジョットと読む。

JWTのストラクチャ

ヘッダー、ペイロード、署名(シグネチャ)の3つの要素からなる。
それぞれが.で区切られている。

ざっくりしたイメージ
xxxx.yyyy.zzzz
実際のJWT
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
t42p4AHef69Tyyi88U6+p0utZYYrg7mmCGhoAd7Zffs

ヘッダー

ヘッダーは通常、トークンの種類(JWT)と、使用する署名アルゴリズム(HMAC SHA256やRSAなど)の2つの部分から構成されている。Base64でエンコード。

ペイロード

ユーザー情報や認証対象となるエンティティに関する情報からなる。
Base64でエンコード。

署名

エンコードされたヘッダーとペイロードをにヘッダーで指定したアルゴリズムと秘密鍵を用いて作成する。

.で繋ぎ合わせれば完成。

JWTの注意点・リスク

良さげな記事を見つけたので貼っておきます。
セキュリティ視点からの JWT 入門

飛ぶのがめんどくさい人のために簡単に説明すると、
・検証を行うサーバー側であらかじめアルゴリズムをしっかり選定しよう。
>1.ヘッダーにalg:noneを設定させるとセキュリティホールになる
>2.RS256 の公開鍵を HS256 の共通鍵として使用する攻撃 を回避する

・HMACはできれば避けよう
>使用される共通鍵が脆弱な(短い)文字列の場合に、その文字列をブルートフォースによって特定されるから

[python]API認証におけるJWT実装の流れ

前提

  1. API認証を想定している。
  2. 秘密鍵はダウンロード済み。
  3. secretsは秘密鍵

実装

1.事前準備

Bash
$ pip install pyjwt

2.JWTの作成

JWT
import jwt  

#相手サーバーのAPIドキュメントによって内容は変わります。
payload = {           
  "iat": 1653199095,
  "jti": "da5dd8a6-15c5-4197-9f6b-cc0f6051dcf2",
  "type": "access",
  "sub": "U0000000120",
  "nbf": 1653199095,
  "exp": 1653199995
}

jwt_assertion = jwt.encode(
  payload,
  secrets,
  algorithm='RS512'
  headers={
    'kid':keyId   #JWTへの署名に使用する公開キーのID
  }
}

3.アクセストークンのリクエスト

access_tokenのリクエスト
import json
import requests

#適宜パラメータを付け加えてください。
params = {
    'grant_type': urn:ietf:params:oauth:grant-type:*,
    'assertion': assertion,
    'client_id': clientid,
    'client_secret': clientSecret
}
response = requests.post(authentication_url, params)
access_token = response.json()['access_token']


大体のAPI認証の流れはこんな感じになると思います。
ありがとうございました。

参考記事

【JWT】 入門
JWT公式
わくわくバンク JWTの仕組みと注意点

4
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
8