エンドポイント登録
ここで好きなURLをAPI発行所として設定することができます。
callbackでAPI発行処理等を書いた関数を登録
permission_callbackでAPI発行する前にトークン認証したりすることができます。(これは必須ではありません)
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
add_action('rest_api_init', function () { // フック関数 register_rest_route('tsuriba/v1', '/token', array( // URLになるところ、https:// ドメイン /wp-json/ 〜ここからの部分(/wp-json/までは固定されてる) 'methods' => 'POST', // 通信の種類、ポストに設定するとポストの受付、ゲットはゲットで同じURLで分けれる 'callback' => 'tsuriba_generate_token', // APIの処理内容を書く、コールバック関数 'permission_callback' => '__return_true', // ヘッダーで通信チェックする、コールバック関数 )); }); // URLの部分は地名など複数受け入れたい時は正規表現が便利 // /station/(?P<id>[a-zA-Z0-9_-]+) // ↑これで /station/ に続くURLは何が来ても受け取れる function tsuriba_generate_token($data) { // add_action()で登録するコールバック関数の冒頭 $station = sanitize_text_field($data['id']); //これでURLを安全に文字列化して変数に格納できる // ここから条件分岐で処理を変えれる |
トークンエンドポイント
秘密キーの設定(公開外)
例: /home/username/secret-config.php
|
1 2 |
<?php define('JWT_SECRET_KEY', 'my-very-secret-key-change-this!'); |
キーの隠し方はこっち
トークン発行エンドポイント
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
use Firebase\JWT\JWT; use Firebase\JWT\Key; add_action('rest_api_init', function () { register_rest_route('tsuriba/v1', '/get-token', array( 'methods' => 'POST', 'callback' => 'tsuriba_issue_token', 'permission_callback' => '__return_true', // 認証不要 )); }); function tsuriba_issue_token(WP_REST_Request $request) { require_once('/home/username/secret-config.php'); // ここで最低限の認証を入れる(例:固定パスワードやAppの秘密キー) $client_key = $request->get_param('client_key'); if ($client_key !== ' キー ') { //このキーも環境変数か秘密キーの設定(公開外)の変数に入れたほうがいいです。 return new WP_Error('invalid_client', 'クライアント認証に失敗しました', array('status' => 403)); } $issuedAt = time(); $expire = $issuedAt + (60 * 30); // 30分で期限切れ $payload = array( 'iss' => get_site_url(), // 発行者 'iat' => $issuedAt, // 発行時刻 'exp' => $expire, // 有効期限 'sub' => 'ios-app' // 対象 ); $jwt = JWT::encode($payload, JWT_SECRET_KEY, 'HS256'); return array( 'token' => $jwt, 'expires_in' => 1800 ); } |
保護されたエンドポイントでのチェック
他のエンドポイントでは、トークンを検証する permission_callback を使います。
要するにこの関数をエンドポイント登録のところで permission_callback として設定してAPIを発行する前にヘッダーでトークンをチェックしてからAPIを発行して安全性を高めようということです。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
function tsuriba_check_jwt(WP_REST_Request $request) { // secret-config を読み込む(パスは環境に合わせる) require_once('/home/username/secret-config.php'); // Authorization ヘッダを取得(WP_REST_Request 経由が安全) $auth = $request->get_header('authorization'); // 小文字でもOK if (empty($auth) || stripos($auth, 'Bearer ') !== 0) { return new WP_Error('no_auth', 'トークンが必要です', array('status' => 401)); } // トークン抽出 $jwt = substr($auth, 7); try { $decoded = Firebase\JWT\JWT::decode($jwt, new Key(JWT_SECRET_KEY, 'HS256')); return true; } catch (Exception $e) { return new WP_Error('invalid_token', 'トークンエラー: ' . $e->getMessage(), array('status' => 403)); } } |
✅ WP_REST_Request とは?
WordPressのREST APIでコールバック関数を作るときに、自動的に引数として渡されるクラスです。
リクエスト情報を扱う便利なラッパーと思えばOKです。
|
1 2 3 4 5 6 7 8 9 10 |
function tsuriba_issue_token(WP_REST_Request $request) { // POSTされた値を取得 $client_key = $request->get_param('client_key'); // ヘッダの値を取得 $auth = $request->get_header('authorization'); // URLのクエリパラメータを取得 $station_id = $request->get_param('station'); } |
$request->get_param()→$_GETや$_POSTの値をまとめて取得$request->get_header()→ リクエストヘッダの値を取得$request->get_body()→ JSON本文をそのまま取得
普通の $_POST や $_GET を使うより安全で、REST API向けに統一的に扱えるようになっています。
🔹 ポイント
$request->get_json_params()
→application/jsonで送られたリクエストを自動でパースして配列化してくれます。
→file_get_contents("php://input")+json_decodeを自分で書く必要なし!✨- エラー応答もJSONで返せる
→new WP_Error(..., ..., array('status' => 403))を返すと、REST API の標準エラーフォーマットで返却されます。 - 返り値は配列でOK
→ WordPress REST API が自動で JSON に変換して返してくれます。
API発行エンドポイント
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
<?php add_action('rest_api_init', function () { register_rest_route('weather/v1', '/cache', array( 'methods' => 'GET', 'callback' => 'get_weather_cache', )); }); function get_weather_cache() { $cache_key = 'weather_xml_cache'; $cache_time = 600; // キャッシュ秒数(例: 10分) // キャッシュがあるか確認 $cached = get_transient($cache_key); if ($cached !== false) { return json_decode($cached, true); } // XMLを取得 $url = "https://www.data.jma.go.jp/developer/xml/data/...xml"; $xml = simplexml_load_file($url); if (!$xml) { return new WP_Error('no_data', 'XML取得失敗', array('status' => 500)); } // 必要な部分を整形してJSON化 $json = json_encode($xml, JSON_UNESCAPED_UNICODE); // キャッシュ保存 set_transient($cache_key, $json, $cache_time); return json_decode($json, true); } |
👉 こうすると、
https://example.com/wp-json/weather/v1/cacheにアクセスするとキャッシュ済みJSONが取得できる

コメント