Node.js躬行记(32)——F2A实战
📅 2026/6/24 9:18:04
👁️ 次浏览
F2ATwo-Factor Authentication其实是2FA的笔误都表示双因素认证。它是一种安全验证机制要求用户在登录时提供两种不同类型的证据因素来证明身份。在实际应用中F2A/2FA 最常见的表现形式是密码 短信验证码最普遍但安全性相对较低易受 SIM 卡交换攻击。密码 基于时间的一次性密码 the Time-Based One-time Password TOTP如 Google Authenticator、Microsoft Authenticator 等应用生成的 6-8 位动态数字。密码 硬件密钥如 YubiKey安全性最高能有效防御网络钓鱼。我们的后台将会采用第二种表现形式后台服务端基于 Node.js 实现。核心实现原理是基于时间同步的一次性密码TOTPTime-based One-Time Password算法通过“共享密钥”和“时间”两个要素在用户设备与服务器之间生成相同的动态验证码。即服务器和你的手机APP各自使用同一个密钥和当前时间通过相同的算法计算得出一串相同的数字。一、生成密钥1speakeasy.jsNode的生态提供了speakeasy.js库可以生成F2A的密钥还有供F2A设备扫描的地址。npm install --save speakeasy在项目中安装完成后就是调用 speakeasy 的生成方法。router.get( /get/f2a, async (ctx) { const secret speakeasy.generateSecret({ length: 20 }); ctx.body { code: 0, data: { secret: secret.base32, url: secret.otpauth_url, } }; }, );secret 就是一串字符而 url 是个 otpauth 协议的地址生成二维码后便于设备扫描。{ secret: M4STOUBFGM4UUXJXKZJXS5J4IIWEA3KU, url: otpauth://totp/SecretKey?secretM4STOUBFGM4UUXJXKZJXS5J4IIWEA3KU }2账户绑定密钥点击上图中的重新绑定按钮就能将当前 secret 和后台账户绑定起来在账户表中新增两个字段otpauthUrl 和 secret。{ _id: { $oid: 5f81288d3578bb005a79cdc1 }, status: 1, realName: 测试, userName: xxxx.me, cellphone: 13800138000, password: abcd, otpauthUrl: otpauth://totp/SecretKey?secretPU4WG5RDJVZVCSDHMM5UYSBFEMSEANBQ, secret: PU4WG5RDJVZVCSDHMM5UYSBFEMSEANBQ }后续在登录输入安全码后就可进行校验了。二、绑定应用1APP在应用市场提供了很多的APP用于显示安全码界面基本上都是下图这样例如 authy、2FAS 等。2小程序有个叫二次验证码的小程序也能用于绑定。3飞书小助手还设计了一种更简便的查询方式。在机器人的对话框输入安全码空格后面跟上自己管理后台的账号邮箱例如“安全码 xxxx.com”。如此就能得到该账户的最新安全码。原理就是查表然后调用 speakeasy 的 totp() 方法再调用飞书的接口发送消息。const account await this.models.BackendUserAccount.findOne({ userName: email }); const token speakeasy.totp({ secret: account.secret, encoding: base32, }); // 发送回复消息 await this.messageService.sendTextMessage(chat_id, token);不过还有个小问题就是也能收到别人的安全码。但后台都有查询记录若出现问题还能溯源。三、F2A校验1开关增加一步登录校验在使用时会增加门槛所以在通用配置中设计了一个开关。{ isOpen: false, whiteList: [ yyyy.com ] }只有在 isOpen 为 true 时才会开启校验。whiteList 是给特殊账户开启的白名单不需要走校验例如给第三方用的账户。2登录登录设计成了两步两次调用的接口都是 user/login。第一步还是原先的输入邮箱和密码。输入完后去请求登录接口判断是否需要二次校验若返回JSON包含 f2a。{ f2a: true }则显示弹框安全码为必填项点击确定进行二次校验。下面是登录接口中的部分逻辑从通用配置中读取开关信息判断是否弹框最后校验。// 判断是否需要F2A安全校验 const configContent await services.tool.getConfigContent({ key: 1a26f4185f66d6f94ef3897f7a475305 }); if(configContent configContent.isOpen configContent.whiteList.indexOf(userName) -1) { // 未传随机码说明是第一步校验直接返回 if(!code) { ctx.body { f2a: true }; return; } // 校验随机码 const verifyInfo { secret: account.secret, encoding: base32, token: code, } const verify speakeasy.totp.verify(verifyInfo); if(!verify) { ctx.status 400; ctx.body { error: 安全码错误 }; return; } }3过渡期在开启这个功能前会有一段时间的过渡期在登录页面增加说明文档。
3步解锁Mac鼠标隐藏潜力:让普通鼠标变身生产力神器 【免费下载链接】mac-mouse-fix Mac Mouse Fix - Make Your $10 Mouse Better Than an Apple Trackpad! 项目地址: https://gitcode.com/GitHub_Trending/ma/mac-mouse-fix
你是否曾经在macOS上使用第三方鼠…
📅 2026/6/24 9:18:04
一、CSS是什么? CSS(Cascading Style Sheets),即层叠样式表,是一种用于描述HTML文档外观和格式的样式语言。
HTML与CSS的关系
技术角色比喻HTML网页内容的载体人的骨架CSS网页样式的表现人的衣服、妆容JavaScript网页…
📅 2026/6/24 9:18:04
自建房是许多人一辈子的大事,但“建房容易,售后难”是不少业主的真实体会。2026年,随着建材成本上涨、施工队流动性增大,售后服务的优劣直接决定你未来10年、20年的居住体验。今天,我用真实案例和数据,从五…
📅 2026/6/24 9:18:04
这样写完全可以,你的问题列表涵盖了大模型(LLM)Agent 框架从架构设计(Protocol、工厂模式)、异步并发(to_thread)、数据安全(脱敏)、状态管理(Memory、上下文…
📅 2026/6/24 10:28:44
以下是基于原生 Java 客户端(amqp-client)的 RabbitMQ 入门示例代码。为了保持代码清晰,我们将分为连接工具类、简单模式(Hello World)和工作队列模式(Work Queues)三个部分。
1. 前置准备
在运行代码前,请确保已在 pom.xml 中引入 RabbitMQ 客户端依赖:…
📅 2026/6/24 10:28:44
文章目录Charts:iOS 平台的图表绘制库Charts:iOS 平台的图表绘制库
Charts 是一个用于 iOS、tvOS 和 macOS 的开源图表库,支持 8 种图表类型,GitHub 上收获了 28k Star。 Charts 的由来比较简单。Android 端有一个很流行的图表库…
📅 2026/6/24 10:28:44
一、Router 页面路由1. 功能实现应用内不同页面之间的跳转、页面栈管理、页面互相传参;可以实现返回上一页、替换当前页面、退出页面等功能。2. 核心常用router.pushUrl():跳转新页面,保留上一页页面栈,点击返回可以回到上一页&am…
📅 2026/6/24 10:28:44
如果你是华南做塑胶制造的老板或运营负责人,近两年一定感受到一个明显的变化:以前靠展会、地推、电话销售拿订单,现在客户越来越习惯先在短视频平台“搜一下”“刷到再问”。尤其到 2026 年,AI 短视频矩阵已经成为工厂拓客的标配&…
📅 2026/6/24 10:28:44
理解 MCP 概念以后,下一步就是把真实系统接进去。
比如:
公司工单系统
内部 CRM
订单后台
部署平台
知识库
自建搜索服务这一讲我们用一个通用方法,讲清楚如何把外部系统包装成 MCP Tool。
先说结论:先设计边界,再写…
📅 2026/6/24 10:23:44
TaskJuggler脚本编程入门:用代码实现自动化项目管理 【免费下载链接】TaskJuggler TaskJuggler - Project Management beyond Gantt chart drawing 项目地址: https://gitcode.com/gh_mirrors/ta/TaskJuggler
TaskJuggler是一款强大的开源项目管理工具&#…
📅 2026/6/24 0:02:25
终极教程:使用angular-mobile-nav实现流畅的移动页面过渡效果 【免费下载链接】angular-mobile-nav An angular navigation service for mobile applications 项目地址: https://gitcode.com/gh_mirrors/an/angular-mobile-nav
angular-mobile-nav是一款专为…
📅 2026/6/24 0:02:25
Wan2.1-Fun-V1.1-1.3B-InP Web UI使用教程:无需代码的AI视频创作 【免费下载链接】Wan2.1-Fun-V1.1-1.3B-InP 项目地址: https://ai.gitcode.com/hf_mirrors/PAI/Wan2.1-Fun-V1.1-1.3B-InP
Wan2.1-Fun-V1.1-1.3B-InP是一款强大的AI视频创作工具,…
📅 2026/6/24 0:02:25
1. 从手册到实战:SLIDER与SPINBOX控件的深度解析在嵌入式GUI开发里摸爬滚打十几年,我见过太多项目因为界面交互的“小问题”而卡壳。参数调节不跟手、数值输入效率低下,这些看似不起眼的细节,往往是决定产品用户体验成败的关键。e…
📅 2026/6/24 6:06:01
暗黑2重获新生:D2DX如何让经典游戏在现代Windows系统上流畅运行 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx
…
📅 2026/6/23 2:15:55
CompressO终极指南:免费开源的视频图像压缩神器 【免费下载链接】compressO Convert any video/image into a tiny size. 100% free & open-source. Available for Mac, Windows & Linux. 项目地址: https://gitcode.com/gh_mirrors/co/compressO
你…
📅 2026/6/24 4:59:40