🔑 JWTとは?
JSON Web Token の略。
一言でいうと、「署名付きの使い捨て通行証」 です。
仕組み
JWTは 3つの部分 から成り立っています:
|
1 |
xxxxx.yyyyy.zzzzz |
ヘッダー (Header)
- 署名方式などを記載
- 例:
{ "alg": "HS256", "typ": "JWT" }
ペイロード (Payload)
- 中身(ユーザーID、発行時間、有効期限など)
- 例:
{ "user": "fishing-app", "exp": 1692931200 }
署名 (Signature)
- 秘密鍵で署名されたハッシュ値
- 改ざんを防止するために必須
🛠️ JWTの流れ(イメージ)
- iOSアプリ → サーバー
- 「トークンをください!」と認証用の秘密情報を送る(例えば固定キー)
- サーバー → iOSアプリ
- サーバー側が「有効期限つきJWT」を発行して返す
- 例:10分間有効
- iOSアプリ → サーバーAPI
- APIを呼ぶときに「JWT」をヘッダーに付与して送る
- 例:
Authorization: Bearer xxxxx.yyyyy.zzzzz
- サーバー側
- JWTを検証(署名が正しいか、有効期限が切れてないか)
- OKならAPI結果を返す
WordPressにfirebase/php-jwtをインストールする方法
PHPが動作する場所で【exec】関数を使う
PHPが動けばどこでも良いみたいなのでREST API練習ついででfunctions.phpに書いてみた。
コマンドは1行で書けそうだがよくわからんので分けた。
以下の記述をしてfunctions.phpを更新後、エンドポイントを叩いた後にレンタルサーバーのファイル管理で /home/ユーザー名/ドメイン名/public_html/vendor/firebase/php-jwt/ が出来ていれば成功。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
<?php add_action('rest_api_init', function(){ register_rest_route('test/api', '/test',[ 'methods' => 'GET', 'callback' => 'get_test', ]); }); function get_test($request){ $cmd = 'cd /home/ユーザー名/ドメイン名/public_html/'; exec($cmd, $output, $result); $cmd1 = 'composer require firebase/php-jwt'; exec($cmd1, $output, $result); return '実行結果:'.$result; } //$outputは$cmd で指定されたコマンドの出力結果が、行ごとに配列 $output に格納 //$resultは成功で0、失敗で0以外が格納 |
自分で直接アップロードする
ローカルに落とした vendor フォルダーを public_html の下に置く
エンコード、発行
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php use Firebase\JWT\JWT; use Firebase\JWT\Key; require_once(ABSPATH . 'vendor/autoload.php'); $secretKey = getenv('API_SECRET_KEY'); // 環境変数等から秘密鍵を取得 $issuedAt = time(); $expire = $issuedAt + 600; // 10分有効 $payload = [ 'iss' => 'https://example.com', // 発行者 'iat' => $issuedAt, // 発行時間 'exp' => $expire, // 有効期限 'app' => 'fishing-app' // アプリ識別子 ]; // JWT生成 $jwt = JWT::encode($payload, $secretKey, 'HS256'); echo json_encode(['token' => $jwt]); |
デコード、認証する
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?php use Firebase\JWT\JWT; use Firebase\JWT\Key; require_once(ABSPATH . 'vendor/autoload.php'); $secretKey = getenv('API_SECRET_KEY'); $headers = getallheaders(); if (!isset($headers['Authorization'])) { http_response_code(401); exit(json_encode(['error' => 'No token'])); } list(, $jwt) = explode(' ', $headers['Authorization']); try { $decoded = JWT::decode($jwt, new Key($secretKey, 'HS256')); // 検証成功!API処理を続ける echo json_encode(['ok' => true, 'msg' => 'JWT valid']); } catch (Exception $e) { http_response_code(403); echo json_encode(['error' => 'Invalid or expired token']); } |
1. JWT::decode
- クライアント(iOSアプリ)から送られてきた JWT文字列
$jwtをデコードします。 - 署名の正当性をチェックするために、秘密鍵
JWT_SECRET_KEYとアルゴリズム(ここでは'HS256'(ハッシュ技術))を指定しています。
2. 認証の仕組み
- JWT は「ヘッダ」「ペイロード」「署名」の3部構成。
- サーバーは受け取ったトークンの 署名が自分の秘密鍵と一致するか を確認。
→ 一致すれば「このトークンは改ざんされていない」と判断できます。
3. $decoded
- 認証に成功すると
$decodedにペイロードの内容(例:user_id,exp有効期限)がオブジェクトとして返ります。 - 逆に秘密鍵が違ったり、有効期限が切れていたりすると 例外が投げられます。
4. return true;
- ここではシンプルに「認証OKなら true を返す」という設計になっています。
- 実際の運用では
$decodedの中身(expなど)をチェックして、期限切れならfalseを返す、など追加できます。


コメント