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

如何在Apostrophe CMS登录时为用户添加唯一验证代码

在Apostrophe CMS登录时自动为用户添加唯一验证代码的实现方案

步骤1:为用户模型添加存储字段

首先需要在用户文档中新增字段用于存储唯一代码,修改modules/@apostrophecms/user/index.js:

module.exports = {
  fields: {
    add: {
      authToken: {
        type: 'string',
        label: '唯一验证代码',
        private: true // 标记为私有,避免前端或API返回泄露
      }
    }
  }
};

步骤2:扩展登录模块实现自动生成逻辑

无需使用weak2FA示例中的前端组件返回逻辑,直接利用登录成功钩子处理代码生成与存储。修改modules/@apostrophecms/login/index.js:

const crypto = require('crypto');

module.exports = {
  extend: '@apostrophecms/login',
  hooks: {
    // 登录成功后触发的钩子
    async afterLogin(req, user) {
      // 生成32位随机唯一代码(基于Node.js crypto模块,安全性更高)
      const uniqueAuthToken = crypto.randomBytes(16).toString('hex');
      
      // 更新数据库中的用户文档
      await this.apos.doc.db.updateOne(
        { _id: user._id, type: '@apostrophecms/user' },
        { $set: { authToken: uniqueAuthToken } }
      );
      
      // 同步更新内存中的用户对象,确保当前请求后续流程能直接获取
      req.user.authToken = uniqueAuthToken;
    }
  }
};

替代方案:重写verify方法(适用于验证阶段处理的场景)

如果需要在用户名密码验证通过后立即执行逻辑,可重写登录模块的verify方法:

const crypto = require('crypto');

module.exports = {
  extend: '@apostrophecms/login',
  methods: {
    async verify(req, username, password) {
      // 调用父类方法完成用户名密码验证
      const user = await super.verify(req, username, password);
      
      if (user) {
        // 生成唯一代码
        const uniqueAuthToken = crypto.randomBytes(16).toString('hex');
        
        // 更新用户文档
        await this.apos.doc.db.updateOne(
          { _id: user._id, type: '@apostrophecms/user' },
          { $set: { authToken: uniqueAuthToken } }
        );
        
        user.authToken = uniqueAuthToken;
      }
      
      // 返回用户对象,不返回任何组件,确保前端正常完成登录
      return user;
    }
  }
};

后续使用说明

登录完成后,后续请求中可通过req.user.authToken获取该唯一代码,用于自定义身份验证逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 00:03:19