如何实现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
相关产品推荐
相关产品推荐

