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キーにレート制限を設ける方法については以下で解説しています。