ユーザーがAPIキーを再発行できる機能の実装方法

ブログ

WordPressサイトでユーザーが自分のAPIキーを再発行できる機能を追加する方法について解説します。この機能を実装することで、ユーザーは必要に応じて自分のAPIキーを再発行し、安全に管理できるようになります。

APIキー再発行機能の概要

この機能では、ユーザーがログインした状態で「APIキーを再発行」ボタンをクリックすると、新しいAPIキーが発行され、既存のAPIキーが更新される仕組みです。再発行後、新しいAPIキーはユーザーに表示され、古いAPIキーは無効になります。

必要なコードの実装

まずは、ユーザーログイン&APIキー確認テンプレートを基にAPIキー再発行機能を追加します。

更後のコード(APIキー再発行機能追加)

<?php
/**
 * Template Name: ユーザーログイン&APIキー確認
 */
get_header();
?>

<div class="login-container">
    <?php
    if (is_user_logged_in()) {
        // ユーザーがログイン済みの場合
        $user = wp_get_current_user();
        $api_key = get_user_meta($user->ID, 'api_key', true);

        // APIキー再発行処理
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'regenerate_api_key') {
            $new_api_key = bin2hex(random_bytes(16)); // 新しいAPIキーを生成
            update_user_meta($user->ID, 'api_key', $new_api_key); // ユーザーのAPIキーを更新
            $api_key = $new_api_key; // 新しいAPIキーを表示するために変数を更新
            echo '<p style="color:green;">新しいAPIキーが発行されました。</p>';
        }
        ?>

        <h2>ようこそ, <?php echo esc_html($user->display_name); ?> さん</h2>
        <p>あなたのAPIキー:</p>
        <input type="text" value="<?php echo esc_attr($api_key); ?>" readonly>

        <!-- APIキー再発行フォーム -->
        <form method="post">
            <input type="hidden" name="action" value="regenerate_api_key">
            <button type="submit" class='btn'>APIキーを再発行</button>
        </form>

        <!-- ログアウトフォーム -->
        <form method="post">
            <input type="hidden" name="action" value="logout">
            <button type="submit" class='btn'>ログアウト</button>
        </form>

    <?php
    } else {
        // ユーザーがログインしていない場合
        if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'login') {
            $username = sanitize_user($_POST['username']);
            $password = $_POST['password'];
            $remember = isset($_POST['remember']);

            $user = wp_signon(array(
                'user_login'    => $username,
                'user_password' => $password,
                'remember'      => $remember,
            ), false);

            if (is_wp_error($user)) {
                echo '<p style="color:red;">ログインに失敗しました。ユーザー名またはパスワードが間違っています。</p>';
            } else {
                // リダイレクト
                wp_redirect(get_permalink());
                exit;
            }
        }
        ?>

        <h2>ログイン</h2>
        <form method="post">
            <p>
                <label for="username">ユーザー名</label><br>
                <input type="text" name="username" id="username" required>
            </p>
            <p>
                <label for="password">パスワード</label><br>
                <input type="password" name="password" id="password" required>
            </p>
            <p>
                <input type="checkbox" name="remember" id="remember">
                <label for="remember">ログイン情報を記憶する</label>
            </p>
            <input type="hidden" name="action" value="login">
            <p>
                <input type="submit" value="ログイン">
            </p>
        </form>

    <?php } ?>
</div>

<?php get_footer(); ?>

主な変更点

.1. APIキー再発行フォームの追加

ログイン後、ユーザーは自分のAPIキーを再発行できるボタンをクリックできるようになります。このボタンが押されると、新しいAPIキーが発行され、表示されます。

<form method="post">
    <input type="hidden" name="action" value="regenerate_api_key">
    <button type="submit" class='btn'>APIキーを再発行</button>
</form>

.2. APIキー再発行処理

ボタンが押されると、$_POSTactionregenerate_api_keyとして送信され、サーバー側で新しいAPIキーが生成されます。このAPIキーはupdate_user_meta()関数を使ってユーザーのメタ情報として保存されます。

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['action']) && $_POST['action'] === 'regenerate_api_key') {
    $new_api_key = bin2hex(random_bytes(16)); // 新しいAPIキーを生成
    update_user_meta($user->ID, 'api_key', $new_api_key); // ユーザーのAPIキーを更新
    $api_key = $new_api_key; // 新しいAPIキーを表示するために変数を更新
    echo '<p style="color:green;">新しいAPIキーが発行されました。</p>';
}

.3. 新しいAPIキーの表示

APIキーが再発行された後、ユーザーにはその新しいAPIキーが表示されます。これにより、ユーザーはいつでも自分のAPIキーを確認できます。

<input type="text" value="<?php echo esc_attr($api_key); ?>" readonly>
タイトルとURLをコピーしました