如何在WordPress登录后通过URL向第三方平台发送JWT Token实现SSO
实现WordPress登录后向第三方平台发送JWT Token完成SSO
场景说明
- 配置的SSO登录URL:https://mywordpressite.com/login
- 发起请求时会附加
returnurl参数,示例格式:https://mywordpresssite.com/login&returnurl=https://nonwordpresssite.com/mycourses - WordPress登录成功后,需重定向至目标URL:https://nonwordpresssite.com/mycourses?ssoToken=
核心需求
实现WordPress登录后向另一平台发送JWT Token以完成SSO。
实现步骤
1. 监听WordPress登录成功事件
利用WordPress原生的wp_login钩子,在用户登录完成后触发自定义逻辑:
add_action('wp_login', 'handle_sso_jwt_redirect', 10, 2); function handle_sso_jwt_redirect($user_login, $user) { // 后续SSO逻辑写在此处 }
2. 提取并验证returnurl参数
从请求中获取returnurl,同时做域名合法性校验,避免开放重定向漏洞:
$return_url = isset($_GET['returnurl']) ? esc_url_raw($_GET['returnurl']) : home_url('/'); // 限定允许跳转的第三方平台域名 $allowed_domains = ['nonwordpresssite.com']; $parsed_target = parse_url($return_url); if (!isset($parsed_target['host']) || !in_array($parsed_target['host'], $allowed_domains)) { $return_url = home_url('/'); }
3. 生成JWT Token
使用firebase/php-jwt库(通过Composer安装:composer require firebase/php-jwt)生成包含用户信息的Token:
require_once get_stylesheet_directory() . '/vendor/autoload.php'; use Firebase\JWT\JWT; // 替换为双方约定的安全密钥 $jwt_secret = 'your_strong_unique_secret_key'; $payload = [ 'iss' => 'https://mywordpressite.com', // 签发方标识 'sub' => $user->ID, // WordPress用户ID 'email' => $user->user_email, 'exp' => time() + 1800 // Token有效期(30分钟) ]; $jwt_token = JWT::encode($payload, $jwt_secret, 'HS256');
4. 重定向至第三方平台并携带Token
将生成的Token拼接到目标URL的ssoToken参数中,完成跳转:
$sso_redirect_url = add_query_arg('ssoToken', $jwt_token, $return_url); wp_redirect($sso_redirect_url); exit;
5. 安全注意事项
- 全程使用HTTPS传输,防止Token被明文窃取
- JWT密钥需足够复杂,且仅在WordPress和第三方平台之间共享
- 严格校验
returnurl的域名范围,禁止跳转到未授权站点 - 根据业务需求合理设置Token有效期,避免长期有效带来的风险
内容的提问来源于stack exchange,提问作者Zeel Patel
相关产品推荐
相关产品推荐

