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

