WordPress JWT 教程2: 完成一个更新用户信息的接口
像素鱼丸
12-31
206
0

当然可以!下面是一个 安全、完整 的 WordPress REST API 接口示例,用于 让用户修改自己的信息(如昵称、邮箱等),并且在接口内部 通过 JWT 验证后自动获取当前用户的 ID,确保用户只能修改自己的资料。

✅ 前提:你已经按照上一回答配置好了 firebase/php-jwt 并能成功验证 Token。


✅ 目标

  • 路由:POST /wp-json/my-jwt/v1/update-profile
  • 方法:仅允许已认证用户调用
  • 功能:更新当前用户的 display_nameuser_email(可扩展)
  • 安全:用户只能修改自己的信息,不能冒充他人

✅ 接口代码(添加到你的自定义插件中)

// 在你的 my-jwt-auth.php 插件文件中追加以下代码

add_action('rest_api_init', function () {
    register_rest_route('my-jwt/v1', '/update-profile', [
        'methods' => 'POST',
        'callback' => 'my_jwt_update_profile_handler',
        'permission_callback' => 'my_jwt_validate_token', // 复用之前的验证函数
    ]);
});

/**
 * 更新当前用户资料
 */
function my_jwt_update_profile_handler(WP_REST_Request $request)
{
    // 从请求中获取 jwt_user_id(已在 my_jwt_validate_token 中设置)
    $user_id = $request->get_param('jwt_user_id');
    if (!$user_id) {
        return new WP_Error('no_user', 'User not authenticated.', ['status' => 401]);
    }

    $user = get_user_by('ID', $user_id);
    if (!$user) {
        return new WP_Error('invalid_user', 'User not found.', ['status' => 404]);
    }

    // 获取要更新的字段(只允许安全字段)
    $allowed_fields = ['display_name', 'first_name', 'last_name', 'user_email'];
    $updates = [];

    foreach ($allowed_fields as $field) {
        if ($request->has_param($field)) {
            $value = sanitize_text_field($request->get_param($field));
            if ($field === 'user_email') {
                $value = sanitize_email($value);
                if (!is_email($value)) {
                    return new WP_Error('invalid_email', 'Invalid email address.', ['status' => 400]);
                }
                // 检查邮箱是否已被他人使用
                if (email_exists($value) && $value !== $user->user_email) {
                    return new WP_Error('email_exists', 'This email is already in use.', ['status' => 400]);
                }
            }
            $updates[$field] = $value;
        }
    }

    if (empty($updates)) {
        return new WP_Error('no_data', 'No valid fields to update.', ['status' => 400]);
    }

    // 执行更新
    $updates['ID'] = $user_id;
    $result = wp_update_user($updates);

    if (is_wp_error($result)) {
        return $result;
    }

    // 返回更新后的用户信息
    $updated_user = get_user_by('ID', $user_id);
    return new WP_REST_Response([
        'success' => true,
        'message' => 'Profile updated successfully.',
        'user' => [
            'id' => $updated_user->ID,
            'username' => $updated_user->user_login,
            'display_name' => $updated_user->display_name,
            'first_name' => $updated_user->first_name,
            'last_name' => $updated_user->last_name,
            'email' => $updated_user->user_email,
        ],
    ], 200);
}

✅ 使用示例

请求地址:

POST /wp-json/my-jwt/v1/update-profile

Headers:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.xxxxx
Content-Type: application/json

Body(JSON):

{
  "display_name": "New Display Name",
  "first_name": "John",
  "last_name": "Doe",
  "user_email": "john.new@example.com"
}

? 只有传递了有效 JWT 且 token 中包含合法用户 ID 的请求才能成功。
即使攻击者知道别人 ID,也无法绕过 jwt_user_id(因为 token 是签名的,无法伪造)。


✅ 安全说明

安全点 说明
✅ 用户隔离 只能修改 jwt_user_id 对应的用户,无法指定其他 ID
✅ 字段白名单 仅允许更新预定义的安全字段,防止任意字段写入(如 user_pass、role)
✅ 邮箱验证 检查格式 + 是否被占用
✅ 数据清理 使用 sanitize_text_fieldsanitize_email
✅ 无密码修改 不处理密码(如需改密码,应单独做“修改密码”接口 + 旧密码验证)

? 不要做的事

  • 不要接受 user_idID 作为请求参数(否则可越权)
  • 不要允许更新 user_loginuser_passrole 等敏感字段(除非有额外验证)
收藏
打赏
WordPress JWT 教程1: Wordpress 添加 JWT 验证
上一篇
WordPress 如何实现登录后才可以阅读全文
下一篇

发表评论

注册不是必须的

像素鱼丸
152 文章
0 评论
4 喜欢
最新文章

网站的 Cookie 弹窗

在当前的法规环境下(截至2026年4月),一个合规的Cookie弹窗设计必须遵循“透明、公平、明确”的原则,核心是确保用户拥有真正的选择权。 以下是现阶段设计合规Cookie弹窗的关键要点: 现阶段合规设计要点 禁止默认同意 弹窗出现时,所有非必要Cookie的选项都不能被预先勾选。用户必须通过一个明确的、主动的动作(如点击按钮或勾选方框)来表示同意。 提供平等的选择权 “拒绝”按钮必须在视觉上和 […]

网页设计中 banner、jumbotron、hero 都有什么区别

在网页设计和开发中,banner、jumbotron、hero 这些词通常指代页面顶部最引人注目的区域,但它们在具体含义和使用场景上有所区别。 🎯 核心概念辨析 Banner (横幅/条幅广告) 这是一个非常广泛的术语,通常指网页上任何矩形的广告或信息区域,可以出现在页面的顶部、侧边或底部。它更偏向于广告或信息展示的功能。 Jumbotron (巨幕) 这个词源于 Bootstrap 等前端框架, […]

宝塔 Nginx 拦截了 WordPress 返回 404 的状态

REST api 接口中,有段代码返回404,但是没有正常返回错误json: $wp_response = new \WP_REST_Response(array('error'=>'没有找到数据')); $wp_response->set_status(404); return $wp_response; 返回内容是: <html> <head><tit […]

Mirage 主题 v2.93.0 发布

更新内容: refactor 移除图片高宽比开关 refactor 移除全局的TOC生成开关 refactor 优化 header.php 中的seo模块和样式覆盖 feat 主题启用的时候,移除非当前主题注册的小工具 fix 修复分类小工具的bug feat 管理员打开后台,检查最当前设置首页布局的模块,如果缺少最新模块,就添加到隐藏模块列表中 fix 优化链接卡片样式 fix 优化热门文章样式 […]
生成中...
扫描二维码
扫描二维码
用户登录