You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现React Native WebView中通过Firebase JWT自动登录WordPress

解决Firebase JWT自动登录WordPress的方案

先解决你遇到的路径错误问题

你在Code Snippets中使用__DIR__会指向插件自身的admin-menus目录,而php-jwt是安装在WordPress根目录的vendor下,所以路径不匹配。把引入autoload的代码改成:

require ABSPATH . 'vendor/autoload.php';

ABSPATH是WordPress内置的根目录常量,能准确定位到你安装php-jwt的位置。

修正JWT验证逻辑(核心问题)

Firebase的JWT采用RS256非对称加密,不能用项目ID作为密钥,必须使用Firebase的公钥验证签名。下面是完整可运行的修正代码:

require ABSPATH . 'vendor/autoload.php';
use Firebase\JWT\JWT;
use Firebase\JWT\Key;

add_action('init', 'handle_firebase_jwt_login');

function handle_firebase_jwt_login() {
    // 过滤无效请求:无token或已登录则跳过
    if (empty($_GET['jwt_token']) || is_user_logged_in()) {
        return;
    }

    $jwt_token = sanitize_text_field($_GET['jwt_token']);

    try {
        // 缓存Firebase公钥(避免每次请求拉取)
        $firebase_public_keys = get_transient('firebase_public_keys');
        if (!$firebase_public_keys) {
            $firebase_public_keys = json_decode(file_get_contents('https://www.googleapis.com/robot/v1/metadata/x509/securetoken@system.gserviceaccount.com'), true);
            set_transient('firebase_public_keys', $firebase_public_keys, 3600); // 缓存1小时
        }

        // 解析JWT头部获取密钥ID,匹配对应公钥
        $jwt_header = JWT::decode($jwt_token, new Key('', 'none'));
        $public_key = $firebase_public_keys[$jwt_header->kid];

        // 验证JWT签名及受众、发行方
        $decoded = JWT::decode(
            $jwt_token,
            new Key($public_key, 'RS256'),
            [
                'aud' => '你的Firebase项目ID', // 替换为你的项目ID
                'iss' => 'https://securetoken.google.com/你的Firebase项目ID' // 替换为你的项目ID
            ]
        );

        // 提取用户信息
        $user_email = $decoded->email;
        $user_name = $decoded->name ?? $user_email; // 无name字段则用邮箱替代

        // 查找或创建WordPress用户
        $user = get_user_by('email', $user_email);
        if (!$user) {
            $random_password = wp_generate_password(12, false); // 生成随机密码
            $user_id = wp_create_user($user_email, $random_password, $user_email);
            wp_update_user([
                'ID' => $user_id,
                'display_name' => $user_name
            ]);
            $user = get_user_by('id', $user_id);
        }

        // 执行WordPress登录操作
        wp_set_current_user($user->ID);
        wp_set_auth_cookie($user->ID, true); // true表示记住登录状态

        // 跳转到主页并清除token参数
        wp_redirect(home_url());
        exit;
    } catch (Exception $e) {
        // 验证失败时跳转到登录页并提示错误
        wp_redirect(home_url('/wp-login.php?error=invalid_token'));
        exit;
    }
}

代码部署建议

  • 避免用Code Snippets:推荐将代码放到当前主题的functions.php中,或者自己写一个极简自定义插件(新建php文件,添加插件头注释后放到wp-content/plugins目录),这样更稳定,不会受插件目录结构影响。
  • 确保已安装php-jwt:在WordPress根目录执行composer require firebase/php-jwt。

miniOrange免费版的局限性

miniOrange免费版仅支持用户主动点击登录按钮跳转Firebase授权,无法实现你需要的App传递JWT自动登录,所以自定义代码是更适合的方案。

React Native端配合

在WebView的URL中携带JWT参数,注意对token进行URL编码:

// React Native示例代码
const jwtToken = '从Firebase获取的JWT';
const encodedToken = encodeURIComponent(jwtToken);
const webViewUrl = `https://你的WordPress域名/?jwt_token=${encodedToken}`;

内容的提问来源于stack exchange,提问作者confusedman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 06:20:27