そもそもJWTとは?
・【JWT】 入門
この記事がわかりやすかったので参考までに
・API認証やアクセス制御などで用いられる規格の一つ。
・公開鍵暗号に基づくメッセージ認証コードにより改ざんやなりすましを防ぐ。
・JWT(JSON Web Token)でジョットと読む。
JWTのストラクチャ
ヘッダー、ペイロード、署名(シグネチャ)の3つの要素からなる。
それぞれが.
で区切られている。
xxxx.yyyy.zzzz
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.
t42p4AHef69Tyyi88U6+p0utZYYrg7mmCGhoAd7Zffs
ヘッダー
ヘッダーは通常、トークンの種類(JWT)と、使用する署名アルゴリズム(HMAC SHA256やRSAなど)の2つの部分から構成されている。Base64でエンコード。
ペイロード
ユーザー情報や認証対象となるエンティティに関する情報からなる。
Base64でエンコード。
署名
エンコードされたヘッダーとペイロードをにヘッダーで指定したアルゴリズムと秘密鍵を用いて作成する。
.
で繋ぎ合わせれば完成。
JWTの注意点・リスク
良さげな記事を見つけたので貼っておきます。
セキュリティ視点からの JWT 入門
飛ぶのがめんどくさい人のために簡単に説明すると、
・検証を行うサーバー側であらかじめアルゴリズムをしっかり選定しよう。
>1.ヘッダーにalg:none
を設定させるとセキュリティホールになる
>2.RS256 の公開鍵を HS256 の共通鍵として使用する攻撃 を回避する
・HMACはできれば避けよう
>使用される共通鍵が脆弱な(短い)文字列の場合に、その文字列をブルートフォースによって特定されるから
[python]API認証におけるJWT実装の流れ
前提
- API認証を想定している。
- 秘密鍵はダウンロード済み。
-
secrets
は秘密鍵
実装
1.事前準備
$ pip install pyjwt
2.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.アクセストークンのリクエスト
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認証の流れはこんな感じになると思います。
ありがとうございました。