WordPressのカスタムテーブルにAPI機能を実装する

ブログ

WordPressのREST APIを利用する際に、APIキーによる認証を導入する方法を解説します。本記事では、映画レビューを管理するカスタムテーブル「movie_reviews」のデータを取得するAPIエンドポイントを作成し、APIキーを用いた認証を追加する手順を説明します。

API認証を行わない場合については、以下記事で紹介しています

1. APIキーの管理方法

APIキーは、ユーザー登録時に自動発行し、ユーザーメタに保存して管理します。
ユーザー登録機能の作り方は以下で解説しています。

1-1. APIキーの自動発行

新規ユーザー登録時にAPIキーを自動発行し、user_metaに保存する関数を実装します。

/**
 * 新規ユーザー登録時にAPIキーを自動発行する
 *
 * @param int $user_id 新規作成されたユーザーのID
 */
function generate_api_key_on_registration($user_id) {
    // 既にAPIキーが発行されていないかチェック
    if (!get_user_meta($user_id, 'api_key', true)) {
        $api_key = bin2hex(random_bytes(16)); // 32文字のAPIキーを生成
        update_user_meta($user_id, 'api_key', $api_key);
    }
}
add_action('user_register', 'generate_api_key_on_registration');

既存ユーザーにまとめてAPIキーを発行する方法は以下で解説しています。

また、ユーザーがAPIキーを確認できる方法を追加する方法は以下で解説しています。

APIキーの再発行機能の作り方は以下で解説しています。

1-2. APIキーの取得関数

APIキーを取得する関数を用意し、ユーザーが自身のAPIキーを確認できるようにします。

function get_user_api_key($user_id) {
    return get_user_meta($user_id, 'api_key', true);
}

2. APIキーによる認証の実装

APIリクエスト時にAPIキーをヘッダーで送信し、そのキーの有効性を確認する処理を追加します。

2-1. APIキーの照合を行うコールバック関数

リクエストヘッダーのX-API-Keyに設定されたAPIキーを取得し、ユーザーメタに保存されているAPIキーと照合します。

/**
 * APIキーの照合を行うコールバック関数
 *
 * リクエストヘッダー 'X-API-Key' に設定された値を取得し、
 * ユーザーメタに保存されている api_key と照合します。
 *
 * @param WP_REST_Request $request
 * @return bool|WP_Error
 */
function movie_api_key_check(WP_REST_Request $request) {
    // リクエストヘッダーからAPIキーを取得
    $api_key = $request->get_header('X-API-Key');

    if ( empty($api_key) ) {
        return new WP_Error('rest_forbidden', 'APIキーが必要です。', array('status' => 401));
    }

    // 指定されたAPIキーを持つユーザーを取得(ユーザーメタ 'api_key' を検索)
    $args = array(
        'meta_key'    => 'api_key',
        'meta_value'  => $api_key,
        'number'      => 1,
        'count_total' => false,
    );
    $users = get_users($args);

    if ( empty($users) ) {
        return new WP_Error('rest_forbidden', '正しいAPIキーが必要です。', array('status' => 401));
    }

    // 認証成功
    return true;
}

2-2. APIエンドポイントの作成

映画レビューを取得するAPIエンドポイントを作成し、APIキーによる認証を適用します。

// GETリクエスト用のエンドポイントを登録
function register_movie_reviews_get_endpoint() {
    register_rest_route('reviews/v1', '/list/', array(
        'methods'             => 'GET',
        'callback'            => 'get_movie_reviews',
        'permission_callback' => 'movie_api_key_check',  // APIキー認証を実施
    ));
}
add_action('rest_api_init', 'register_movie_reviews_get_endpoint');

// 映画レビューを取得するコールバック関数
function get_movie_reviews(WP_REST_Request $request) {
    global $wpdb;
    $table_name = $wpdb->prefix . 'movie_reviews';
    $results = $wpdb->get_results("SELECT * FROM {$table_name}", ARRAY_A);
    return new WP_REST_Response($results, 200);
}

3. APIキーを使用したリクエストの実行

APIを利用する際は、ヘッダーにAPIキーを含めてリクエストを送信します。

curl -H "X-API-Key: YOUR_API_KEY" "https://example.com/wp-json/reviews/v1/list/"

このようにすることで、APIキーが正しく認証された場合のみデータを取得できるようになります。

まとめ

APIキーを使用した認証をWordPressのREST APIに実装する方法を紹介しました。これにより、公開APIとしてではなく、適切に認証されたユーザーのみがアクセスできるようになります。

APIキーにレート制限を設ける方法については以下で解説しています。

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