WordPress REST APIでのCookie認証

2024-05-01
ホーム WordPress REST API WordPress REST APIでのCookie認証

クッキー認証とはWordPressのダッシュボード(管理画面に)ログインしているユーザー向けの認証方法です。つまりログインしてないユーザーは対象外。

WordPressはクッキー情報をブラウザに保存することでログイン状態を保持しているから、毎回ログインしなくても済む。

WordPressでのCookie認証は、特に管理画面にログインしているユーザー(つまり、セッションと認証クッキーを持っているユーザー)がサイトのREST APIを使用できるように設計されています。この方式では、通常のブラウザセッションを通じて認証されたユーザーのみがAPIへのアクセス権を持ちます。

認証プロセスの詳細

  • ユーザーがWordPressのログインページ(wp-login.php)からログインします。
  • ログインに成功すると、WordPressはユーザーのブラウザに認証用のクッキーを設定します。
  • ユーザーがWordPressサイト上でREST APIを呼び出す際、ブラウザは自動的にこれらの認証クッキーをリクエストと共に送信します。
  • サーバー側でこれらのクッキーが確認され、有効であればAPIリクエストが処理されます。

クッキー認証のセキュリティ要素

  • ユーザー認証: ユーザーがログインすると、WordPressはユーザーのブラウザに認証クッキーを発行します。このクッキーにはユーザーが認証されたことを示す情報が含まれており、ブラウザが次回サーバーにリクエストを送信する際には、自動的にこのクッキーをサーバーに送り返すことでユーザーは認証されます。
  • セッション維持: クッキー認証は、ユーザーがログインしている間、セッションを維持する手段として機能します。これにより、ユーザーがログイン状態を維持でき、一度ログイン後は再度認証情報を入力することなく、複数のページや機能にアクセスできます。
  • セキュリティの向上: クッキーにはセキュリティ上重要な情報が含まれているため、クッキーの取り扱いにはHTTPSなどの安全な通信プロトコルを使用して保護されます。また、クッキーには有効期限が設定されており、期限が過ぎると自動的に無効になるため、古いセッション情報が不正利用されるリスクを軽減します。

クッキー認証の限界

クッキー認証は、ログイン状態を維持し、ユーザーの操作を認証する効果的な手段ですが、クッキーそのものが盗まれるというセキュリティリスクも伴います(例えば、クロスサイトスクリプティング(XSS)攻撃によるクッキーの盗用)。そのため、クッキーの安全性を保つためには、Webアプリケーション側で十分なセキュリティ対策を講じる必要があります。

主な利用場面

1. WordPress管理画面からのAPIリクエスト

WordPressの管理画面にログインしているユーザーが、管理画面内部で動作するプラグインやテーマの機能を利用する際に、REST APIが使われることがあります。これには、投稿の自動保存、設定の更新、コンテンツの管理などが含まれます。これらのAPIリクエストは、ユーザーがすでにログインしており、クッキー認証を通じて認証情報が確認されるため、追加の認証手続きなしで安全に行われます。

2. カスタムプラグインやダッシュボードウィジェットのAPIリクエスト

開発者がカスタムプラグインやダッシュボードウィジェットを作成する際、これらのコンポーネントが管理画面からデータを取得または送信するためにREST APIを使用することがあります。この場合も、ログインしているユーザーのセッションクッキーを用いてリクエストが認証されます。

3. フロントエンドでのログインユーザーによるインタラクション

WordPressサイトのフロントエンドでログインユーザーがコメントの投稿、フォームの送信、またはユーザープロファイルの編集などを行う際に、これらのアクションを処理するためにREST APIが使用されることがあります。ここでもクッキー認証が利用され、ユーザーの認証状態を確認して処理が行われます。

4. 開発中のテストとデバッグ

開発者が新しいテーマやプラグインを開発中にREST APIをテストする際、クッキー認証を利用して簡単に現在のユーザーセッションからAPIエンドポイントにリクエストを送信し、レスポンスを確認することができます。これにより、開発過程での作業効率が向上します。

実際のコード例

必要なステップ

  1. ユーザーがログインする: ユーザーがサイトにログインしている状態でなければなりません。
  2. wp_nonceを取得する: CSRF攻撃を防ぐため、WordPressはnonce(number used onceの略)を使用します。これをAPIリクエストに含める必要があります。
  3. AJAXリクエストを送信する: JavaScriptを使用して、wp_nonceと共にAPIエンドポイントにリクエストを送信します。

まず、WordPressテンプレートに以下のスクリプトを追加します(例えば、functions.php に追加)。

function enqueue_my_custom_script() {
    wp_enqueue_script('my-custom-script', get_template_directory_uri() . '/js/custom-script.js', array('jquery'), null, true);
    wp_localize_script('my-custom-script', 'wpApiSettings', array(
        'root' => esc_url_raw(rest_url()),
        'nonce' => wp_create_nonce('wp_rest')
    ));
}
add_action('wp_enqueue_scripts', 'enqueue_my_custom_script');

    

次に、JavaScript ファイル (custom-script.js) を作成し、次のように書きます。

jQuery(document).ready(function($) {
    $.ajax({
        url: wpApiSettings.root + 'wp/v2/users/me',  // 'me' はログイン中のユーザー情報を取得
        method: 'GET',
        beforeSend: function (xhr) {
            xhr.setRequestHeader('X-WP-Nonce', wpApiSettings.nonce);
        },
        success: function (response) {
            console.log('User data:', response);
        },
        error: function (response) {
            console.error('Error:', response);
        }
    });
});

    

このコード例では、ログイン中のユーザーのデータを取得しています。`wpApiSettings` オブジェクトは、PHPからスクリプトにREST APIのURLとnonceを渡すために使用されています。`X-WP-Nonce` ヘッダーには、`wp_create_nonce('wp_rest')` によって生成されたnonceが設定されており、このnonceはAPIのリクエストを認証するために必要です。 これで、WordPressのCookie認証を使って、安全にREST APIエンドポイントにアクセスするための基本が設定できました。

Web制作のご依頼・ご相談など、お気軽にご連絡ください。

お問い合わせ