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

如何基于Strapi用户权限插件实现谷歌第三方Auth的HttpOnly Cookie JWT?

要让Strapi的第三方认证接口(如/auth/google/callback)像本地认证那样签发HttpOnly Cookie,需要修改第三方认证的回调处理逻辑,把本地认证里的Cookie设置代码迁移过去,具体步骤如下:

1. 定位第三方认证处理文件

找到Strapi扩展目录下的用户权限控制器文件:/extensions/user-permissions/controllers/Auth.js,重点修改其中的callback方法——这个方法负责处理第三方认证完成后的回调逻辑。

2. 添加HttpOnly Cookie设置逻辑

在callback方法中,生成JWT之后、返回响应之前,插入设置Cookie的代码,完全复用本地认证里的Cookie配置(确保和本地认证的Cookie参数一致):

修改后的callback方法代码示例:

async callback(ctx) {
  const { provider } = ctx.params;
  const params = ctx.request.body;

  try {
    const user = await strapi.plugins['user-permissions'].services.providers[provider].callback(ctx, params);
    const jwt = strapi.plugins['user-permissions'].services.jwt.issue({ id: user.id });

    // 新增:设置HttpOnly Cookie
    const cookieOptions = {
      httpOnly: true,
      secure: process.env.NODE_ENV === 'production', // 生产环境必须开启secure
      maxAge: strapi.config.get('plugin.user-permissions.jwt.expiresIn') * 1000, // 同步JWT过期时间
      sameSite: 'strict', // 根据业务需求调整为'lax'或'none'
      path: '/'
    };
    ctx.cookies.set('token', jwt, cookieOptions); // Cookie名称需和本地认证保持一致

    ctx.send({
      jwt,
      user: sanitizeEntity(user, { model: strapi.plugins['user-permissions'].models.user }),
    });
  } catch (err) {
    ctx.badRequest(null, err.message);
  }
}

3. 关键注意事项

  • 确保Cookie名称(示例中的token)和本地认证设置的名称完全一致,这样你之前修改的/extensions/user-permissions/config/policies/permissions.js里的Token读取逻辑才能统一生效
  • 根据部署环境调整secure参数:开发环境可以设为false,生产环境必须设为true(否则Cookie无法在HTTPS下生效)
  • sameSite参数可根据跨域需求调整,若存在跨域场景可设为'lax',跨域且需要第三方Cookie的场景设为'none'(同时必须开启secure)
  • 重启Strapi服务后测试第三方认证流程,检查浏览器Application面板的Cookie列表,确认生成了带HttpOnly标记的Cookie

4. 兼容前端状态管理

修改后接口仍会返回jwt和用户信息,不影响你前端通过上下文管理鉴权状态的逻辑,同时HttpOnly Cookie会自动随后续API请求携带,满足私有接口的鉴权要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 10:06:16