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

实现WordPress与子域名Node.js站点的类SSO免重复登录方案咨询

跨子域名单点登录(SSO)实现方案

针对你的场景(WordPress主站 mysite.com + NestJS子域名服务 app.mysite.com),以下是几种安全可行的无感知登录实现方案,同时回应你的现有方案顾虑:


方案1:跨子域名Cookie + WordPress身份实时验证

核心思路

利用浏览器跨子域名Cookie共享特性,WordPress登录后设置通配符域名Cookie,NestJS服务通过该Cookie实时验证用户身份,无需提前同步用户数据。

实现步骤

  1. WordPress端配置Cookie

    • 在用户登录/注册成功后,通过setcookie()设置跨域Cookie:
      $user_id = get_current_user_id();
      // 生成防篡改的用户标识(用WordPress密钥加盐)
      $user_token = hash_hmac('sha256', (string)$user_id, SECRET_KEY);
      setcookie(
          'wp_user_token',
          $user_token . ':' . $user_id,
          time() + 3600*24, // 过期时间1天
          '/',
          '.mysite.com', // 通配符子域名
          true, // Secure:仅HTTPS传输(生产环境必须开启)
          true  // HttpOnly:防止XSS窃取
      );
      
    • 利用WordPress钩子处理用户状态变更:
      • profile_update:用户密码更新时,可重置Cookie或标记会话失效
      • delete_user:用户删除时,可触发NestJS接口清除对应会话
  2. NestJS端验证逻辑

    • 读取请求中的wp_user_token Cookie,拆分出用户ID和签名
    • 用相同的WordPress密钥重新计算签名,校验是否匹配(防止Cookie被篡改)
    • 直接连接WordPress数据库或调用REST API的/wp/v2/users/{id}接口,确认用户存在且状态正常

安全要点

  • 必须开启Secure和HttpOnly属性,避免Cookie被窃取或篡改
  • 签名算法使用HMAC,确保Cookie内容无法伪造
  • 生产环境强制HTTPS,防止Cookie明文传输

优缺点

  • 优点:用户完全无感知,无需同步用户数据,身份状态实时一致
  • 缺点:NestJS需获取WordPress数据库访问权限或REST API调用权限

方案2:JWT签发 + 跨子域名Cookie存储

核心思路

WordPress作为身份提供者,在用户登录后签发JWT令牌,存入跨子域名Cookie,NestJS服务验证JWT有效性即可完成身份认证。

实现步骤

  1. WordPress端签发JWT

    • 自定义代码或使用JWT插件,在wp_login钩子触发时生成JWT:
      use Firebase\JWT\JWT;
      $payload = [
          'sub' => get_current_user_id(),
          'exp' => time() + 3600, // 过期时间1小时
          'iss' => 'https://mysite.com'
      ];
      $jwt = JWT::encode($payload, SECRET_KEY, 'HS256');
      // 存入跨子域名Cookie
      setcookie(
          'wp_jwt',
          $jwt,
          time() + 3600,
          '/',
          '.mysite.com',
          true,
          true
      );
      
    • 用户密码更新/删除时,可通过维护JWT黑名单(如Redis)实现令牌主动失效
  2. NestJS端验证JWT

    • 配置JWT验证中间件,使用与WordPress相同的密钥:
      import { JwtModule } from '@nestjs/jwt';
      @Module({
        imports: [
          JwtModule.register({
            secret: '你的WordPress SECRET_KEY',
            signOptions: { expiresIn: '1h' },
          }),
        ],
      })
      
    • 验证通过后,从JWT Payload中获取用户ID,必要时调用WordPress API确认用户状态

安全要点

  • JWT签名密钥必须严格保密,且WordPress与NestJS保持一致
  • 用HttpOnly Cookie存储JWT,避免XSS攻击窃取令牌
  • 合理设置过期时间,结合黑名单处理令牌主动失效场景

优缺点

  • 优点:NestJS无需依赖WordPress数据库,验证效率高
  • 缺点:JWT无法主动撤销,需依赖短过期时间或黑名单机制

方案3:OAuth2.0授权码模式(标准SSO方案)

核心思路

将WordPress配置为OAuth2.0授权服务器,NestJS作为客户端,通过授权码流程实现单点登录,用户仅需在主站登录一次即可访问所有关联服务。

实现步骤

  1. WordPress端配置OAuth服务

    • 安装OAuth2.0插件(如WP OAuth Server),创建客户端应用:
      • 客户端ID/密钥:自定义生成
      • 重定向URI:https://app.mysite.com/auth/callback
      • 授权范围:获取用户基本信息
  2. NestJS端处理授权流程

    • 用户访问需要登录的路由时,跳转到WordPress授权页面:
      // 生成授权跳转URL
      const authUrl = 'https://mysite.com/oauth/authorize?' + new URLSearchParams({
        client_id: '你的客户端ID',
        redirect_uri: 'https://app.mysite.com/auth/callback',
        response_type: 'code',
        scope: 'basic'
      });
      
    • 回调接口接收授权码,换取访问令牌和用户信息:
      // 用授权码换令牌
      const tokenResponse = await fetch('https://mysite.com/oauth/token', {
        method: 'POST',
        body: new URLSearchParams({
          client_id: '你的客户端ID',
          client_secret: '你的客户端密钥',
          code: req.query.code,
          grant_type: 'authorization_code',
          redirect_uri: 'https://app.mysite.com/auth/callback'
        })
      });
      const { access_token, user_info } = await tokenResponse.json();
      // 创建NestJS本地会话或签发JWT
      

安全要点

  • 全程使用HTTPS传输,防止授权码或令牌被窃取
  • 授权码仅允许使用一次,客户端密钥需妥善保管

优缺点

  • 优点:标准SSO方案,扩展性强,支持后续其他子系统接入
  • 缺点:配置流程相对复杂,需依赖第三方OAuth插件

针对你现有方案的补充说明

  1. 用户信息同步方案
    WordPress确实提供钩子支持:user_register(注册)、profile_update(更新)、delete_user(删除)。传递密码时不要传明文,直接传递WordPress生成的PHPass哈希值,NestJS可使用phpass库验证哈希有效性。但该方案存在数据一致性风险,需额外处理同步失败场景。

  2. 子域名调用WP REST API验证
    可结合跨子域名Cookie实现无重复登录:NestJS读取主站设置的Cookie,携带Cookie调用WordPress REST API的/wp/v2/users/me接口,验证用户身份。该方案实现简单,但每次请求都需调用WP API,性能略差。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 08:13:10