在数字时代,仅用密码保护账户已经不够安全。**TOTP(Time-based One-Time Password)是一种基于时间的一次性密码算法,也称为双因素认证(2FA)**的核心技术。
简单来说,TOTP通过将当前时间和一个共享密钥结合起来,使用HMAC-SHA-1等密码算法生成一个6位数字的验证码。这个验证码每30秒自动更新一次,无法被拦截或重复使用,大幅提升了账户安全性。
TOTP的应用场景包括:

TOTP认证过程分为三个阶段:
用户和服务器通过安全通道共享一个密钥(Secret Key)。这个密钥通常以二维码的形式提供,用户扫描二维码后,验证器应用(如Google Authenticator)就能保存这个密钥。
客户端和服务器都基于以下公式独立计算验证码:
TC = floor((当前Unix时间戳 - T0) / TS)
TOTP = HMAC-SHA-1(密钥, TC)
验证码 = TOTP mod 10^6(取最后6位数字)其中:
由于两端的时钟基本同步,在同一个30秒时间窗口内,计算出的验证码完全相同。
用户将生成的验证码输入到登录界面,服务器验证该码是否与本地计算的值匹配。为了防止网络延迟和时钟偏差,大多数服务器会接受前一个时间窗口和后一个时间窗口的验证码。
n8n作为强大的工作流自动化平台,内置了TOTP节点,让开发者能轻松在自动化流程中集成两因素认证功能。
n8n的TOTP节点当前支持**"生成密钥"**操作,具体功能包括:
| 功能项 | 说明 |
|---|---|
| 操作类型 | 生成TOTP密钥(Generate Secret) |
| 输入 | 无需特殊输入,从TOTP凭证中读取配置 |
| 输出 | 生成的验证码、剩余有效时间、二维码等 |
| 算法 | 支持SHA-1(默认)、SHA-256、SHA-512 |
| 位数 | 默认6位,可自定义为4-8位 |
| 时间步长 | 默认30秒,可自定义 |
BVDRSBXQB2ZEL5HE)MyApp、example@gmail.com)TOTP支持多种HMAC哈希算法:
获取Secret的方法:
otpauth://totp/...?secret=xxx的链接secret=后面的值配置完成后,该节点输出内容包括:
{
"token": "123456", // 当前生成的验证码
"secondsRemaining": 18, // 该验证码的剩余有效时间(秒)
"secret": "BVDRSBXQB2ZEL5HE" // 使用的密钥
}使用JavaScript代码处理TOTP节点的输出,提取关键信息:
// 接收TOTP数据并格式化输出
const totpResult = items[0].json;
return {
json: {
status: "验证码已生成",
code: totpResult.token,
validTime: totpResult.secondsRemaining + "秒内有效",
timestamp: new Date().toISOString(),
message: "请在30秒内使用此验证码进行认证"
}
};根据需要配置:
以下是一个完整的n8n TOTP工作流JSON代码,包括所有节点和连接配置。可以直接导入到n8n中使用:
{
"name": "TOTP两因素认证工作流示例",
"description": "完整的n8n TOTP节点使用示例 - 展示如何生成和验证时间密码",
"nodes": [
{
"parameters": {},
"id": "4b36c92d-4c8e-44f6-8f31-7e6e8b8c9d3a",
"name": "开始",
"type": "n8n-nodes-base.start",
"typeVersion": 1,
"position": [
250,
300
]
},
{
"parameters": {
"resource": "secret",
"operation": "generateSecret"
},
"id": "5c47d03e-5d9f-55g7-9g42-8f7f9c9d0e4b",
"name": "生成TOTP密钥",
"type": "n8n-nodes-base.totp",
"typeVersion": 1,
"position": [
450,
300
]
},
{
"parameters": {
"functionCode": "// 接收TOTP密钥和当前时间\nconst totpData = items[0].json;\n\nreturn {\n json: {\n secret: totpData.secret,\n label: totpData.label || 'MyApp',\n qrCode: totpData.qrCode,\n setupTime: new Date().toISOString(),\n message: 'TOTP密钥已生成,请使用Google Authenticator等应用扫描二维码'\n }\n};"
},
"id": "6d58e14f-6e0g-66h8-0h53-9g8g0d0e1f5c",
"name": "处理密钥信息",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
650,
300
]
},
{
"parameters": {
"method": "POST",
"url": "https://webhook.site/unique-id",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"bodyParametersJson": "={\n 'secret': '{{ $node[\"处理密钥信息\"].json.secret }}',\n 'timestamp': '{{ $node[\"处理密钥信息\"].json.setupTime }}',\n 'status': 'TOTP密钥已成功生成'\n}"
},
"id": "7e69f25g-7f1h-77i9-1i64-0h9h1e1f2g6d",
"name": "保存到数据库",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.1,
"position": [
850,
300
]
},
{
"parameters": {
"jsCode": "// 输出最终结果\nreturn [\n {\n json: {\n status: '成功',\n message: 'TOTP工作流执行完成',\n output: $node['保存到数据库'].json\n }\n }\n];"
},
"id": "8f70g36h-8g2i-88j0-2j75-1i0i2f2g3h7e",
"name": "输出结果",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
1050,
300
]
}
],
"connections": {
"开始": {
"main": [
[
{
"node": "生成TOTP密钥",
"type": "main",
"index": 0
}
]
]
},
"生成TOTP密钥": {
"main": [
[
{
"node": "处理密钥信息",
"type": "main",
"index": 0
}
]
]
},
"处理密钥信息": {
"main": [
[
{
"node": "保存到数据库",
"type": "main",
"index": 0
}
]
]
},
"保存到数据库": {
"main": [
[
{
"node": "输出结果",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
},
"versionId": "1.0"
}构建一个完整的用户双因素认证登录系统,包括:
[用户登录表单]
↓
[验证用户名密码]
↓
[TOTP节点生成验证码]
↓
[发送验证码到邮箱/短信]
↓
[等待用户输入验证码]
↓
[验证验证码有效性]
↓
[返回登录成功/失败]验证验证码有效性:
// 获取用户输入的验证码和系统生成的验证码
const userCode = $node['用户输入'].json.code;
const systemCode = $node['TOTP节点生成验证码'].json.token;
const secondsRemaining = $node['TOTP节点生成验证码'].json.secondsRemaining;
// 验证逻辑
if (userCode === systemCode && secondsRemaining > 0) {
return {
json: {
status: "success",
message: "验证通过,登录成功",
userId: $node['用户数据'].json.userId
}
};
} else {
return {
json: {
status: "failed",
message: "验证码错误或已过期,请重新登录"
}
};
}A: 确保n8n所在服务器和用户客户端的系统时间同步。大多数系统会接受±1个时间窗口(±30秒)的验证码,如果偏差太大会导致验证失败。
A: 在TOTP节点的算法参数中选择SHA-256或SHA-512。但要注意,某些旧的验证器应用可能不支持这些算法。
A: 可以。在TOTP节点的位数参数中修改,支持4-8位。但建议保留默认的6位,确保兼容性。
A: TOTP是基于本地时间计算的,不需要网络连接。只要设备时间准确,即可离线生成。
A: 立即更换密钥。联系服务方重新生成TOTP二维码,并在所有验证器应用中删除旧凭证。
n8n的TOTP节点为开发者提供了一个简单而强大的工具,用于在自动化工作流中集成双因素认证。通过本教程,你已经掌握了:
✅ TOTP的基本原理和工作机制
✅ n8n TOTP节点的完整配置方法
✅ 从零开始构建2FA认证工作流
✅ 实战案例和代码示例
✅ 常见问题解决和安全最佳实践
现在你可以自信地在自己的项目中使用TOTP节点,为用户账户增加一层强大的安全保护!
[1] 官方文档: https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.totp/
[2] n8n系列教程: https://www.undsky.com/blog/?category=n8n%E6%95%99%E7%A8%8B#