App 邮箱验证码注册与登录机制说明
可以。我把你前面写的内容重新检查了一遍并把一些容易混淆的地方修正了。下面这版可以直接作为你的开发说明/技术文档使用。App 邮箱验证码注册与登录机制说明一、使用场景在 App 的账号体系中邮箱是一种非常常见的注册和登录方式。用户只需要提供一个能够正常接收邮件的邮箱例如xxxgmail.com xxxoutlook.com xxxqq.com xxx163.com xxxicloud.com 公司邮箱App 通过邮箱验证码确认当前操作这个 App 的用户确实拥有这个邮箱。验证成功后后端即可创建或找到对应的用户账号并允许用户登录。整个链路可以简单理解为App ↓ 用户输入邮箱 ↓ 后端生成验证码 ↓ 发送验证码到邮箱 ↓ 用户输入验证码 ↓ 后端验证 ↓ 注册 / 登录成功二、前端与后端的分工邮箱验证码登录中App 前端和后端承担的工作是不同的。1. App 前端负责App 主要负责用户交互包括输入邮箱 输入验证码 显示60秒重新发送倒计时 发送请求到后端 保存登录成功后的 Token 显示用户资料App 本身不负责生成验证码也不负责判断验证码是否正确。例如用户输入Email: usergmail.com点击获取验证码App 只需要向后端发送{ email: usergmail.com }2. 后端负责后端负责真正的账号安全逻辑包括生成验证码 保存验证码 控制发送频率 发送验证码邮件 判断验证码是否正确 判断验证码是否过期 创建用户 生成 user_id 生成登录 Token 保存用户资料因此真正可信的认证判断必须放在后端。不能只依赖 App因为 App 安装在用户设备上可以被修改或逆向。三、完整的邮箱注册/登录流程第一版账号体系可以设计成用户输入邮箱 ↓ App 调用发送验证码接口 ↓ 后端检查邮箱格式 ↓ 后端生成6位验证码 ↓ 保存验证码的哈希值和过期时间 ↓ 通过 SMTP 发送到用户邮箱 ↓ 用户收到验证码 ↓ 用户在 App 输入验证码 ↓ App 把 email code 发给后端 ↓ 后端验证验证码 ↓ 查询这个邮箱是否已经存在 ↙ ↘ 不存在 已存在 ↓ ↓ 创建新用户 找到原用户 ↘ ↙ 登录成功 ↓ 生成 Token ↓ 返回用户资料这里不需要专门区分“注册”和“登录”。第一次验证邮箱成功后端自动认为这是注册 登录以后再次使用同一个邮箱后端自动认为这是登录已有账号这样 App 端体验会比较简单。四、验证码规则第一版建议固定以下规则验证码长度6位数字 有效时间10分钟 重新发送间隔60秒 最大错误尝试次数5次 验证成功立即失效 重新发送新验证码旧验证码立即失效例如38492160 秒和 10 分钟的区别这两个时间不要混淆。60 秒表示用户请求验证码以后要等待 60 秒才能再次请求。App 可以显示重新发送60s 重新发送59s 重新发送58s ... 重新发送但是 App 的倒计时只负责界面体验。后端也必须真正判断距离上一次发送是否已经超过60秒否则用户可以绕过 App 直接疯狂调用接口。10 分钟表示这个验证码本身的有效期。例如验证码384921 生成时间10:00 过期时间10:10用户在 10:11 输入384921即使验证码数字完全正确后端也应该返回验证码已过期所以60 秒 再次发送限制10 分钟 验证码有效期五、什么是 SMTPSMTP 全称Simple Mail Transfer Protocol中文通常叫简单邮件传输协议SMTP 的主要作用就是发送邮件。在我们的账号系统中SMTP 的作用是让后端拥有“通过某个邮箱账号发送验证码邮件”的能力。六、SMTP 可以怎么理解可以把 SMTP 比喻成一个快递系统。例如后端程序 寄件人 verifyartifex.com 发件人身份 SMTP授权码 寄件人的授权凭证 SMTP服务器 快递公司 用户邮箱 收件地址 6位验证码 快递包裹里的内容后端自己不会直接把验证码“塞进 Gmail 或 QQ 邮箱”。而是后端生成验证码 ↓ 连接 SMTP 服务器 ↓ SMTP服务器确认后端有发信权限 ↓ SMTP服务器发送邮件 ↓ 用户邮箱收到验证码所以 SMTP 可以简单理解为后端与邮件服务器之间的发信通道。七、是不是每一种邮箱都要配置 SMTP不需要。这是一个非常重要的概念。假设你的后端使用verifyartifex.com作为发件邮箱。它可以给gmail.com qq.com 163.com outlook.com icloud.com 企业邮箱 学校邮箱发送验证码。你不需要分别配置Gmail SMTP QQ SMTP 163 SMTP Outlook SMTP因为这些是收件人的邮箱。你只需要配置一个自己的发件邮箱 / 发件邮件服务。结构是→ Gmail用户 / Artifex SMTP → QQ用户 \ → Outlook用户 \ → 163用户八、测试阶段怎么做测试阶段可以使用普通邮箱例如163邮箱 QQ邮箱 Gmail Outlook例如使用artifex_test163.com开启这个邮箱的 SMTP 服务。然后获取对应的SMTP授权码后端使用这个邮箱来发送验证码。九、SMTP 授权码是什么SMTP 授权码不是普通的邮箱登录密码。可以把它理解成专门给软件、服务器或第三方客户端使用的邮箱密码。例如正常网页登录邮箱使用邮箱账号 邮箱密码但是后端程序发送邮件通常使用SMTP_USER SMTP_PASS其中SMTP_PASS就是邮箱服务商提供的SMTP授权码 客户端授权密码 App Password这样即使以后 SMTP 授权码需要更换也不需要暴露真正的邮箱登录密码。十、SMTP 环境配置例如使用公司邮箱SMTP_HOST公司的SMTP服务器地址 SMTP_PORT465 SMTP_SECUREtrue SMTP_USERverifyartifex.com SMTP_PASS公司的SMTP授权码 SMTP_FROMArtifex verifyartifex.com这些配置应该放在后端.env文件中。十一、各个 SMTP 参数是什么意思SMTP_HOST例如SMTP_HOSTsmtp.163.com意思是后端应该连接哪个邮件服务器。可以理解为快递公司的服务器地址。SMTP_PORT例如SMTP_PORT465表示连接 SMTP 服务器所使用的网络端口。一般465经常用于加密 SMTP 连接。SMTP_SECURESMTP_SECUREtrue表示后端和邮件服务器之间使用加密连接。SMTP_USER例如SMTP_USERverifyartifex.com表示后端实际使用哪个邮箱账号发送邮件。SMTP_PASS例如SMTP_PASSxxxxxxxxxxxxxxxx表示这个邮箱提供给后端程序使用的 SMTP 授权密码。这属于敏感信息不能上传到 Git。SMTP_FROM例如SMTP_FROMArtifex verifyartifex.com表示用户收到邮件以后看到的发件人。可能显示为Artifex verifyartifex.com其中Artifex是显示名称。可以修改成Artifex Verification Artifex Account Artifex Security但后面的真实邮箱verifyartifex.com测试阶段最好和SMTP_USER保持一致。十二、验证码到底是谁生成的验证码不是 SMTP 生成的。正确关系是后端 ↓ 生成 6 位验证码 ↓ SMTP ↓ 只负责发送例如后端生成384921SMTP 做的事情只是帮后端把384921发到usergmail.com。所以生成验证码 → 后端 保存验证码 → 后端数据库 验证验证码 → 后端 发送验证码 → SMTP十三、验证码怎么保存不建议数据库直接保存384921而是保存经过哈希处理后的值。例如384921 OTP_HASH_SECRET ↓ 进行 HMAC / Hash ↓ a49f25d84b7c......数据库保存a49f25d84b7c......而不是保存真实验证码。这样即使数据库内容意外泄露也不能直接看到用户正在使用的验证码。十四、什么是 OTP_HASH_SECRET例如.envOTP_HASH_SECRET一串随机生成的长字符它可以理解成验证码哈希处理时使用的秘密配料。例如验证码 384921 OTP_HASH_SECRET ↓ 生成 code_hash收到用户输入的验证码以后再进行同样的计算。如果结果一样验证成功不一样验证失败十五、什么是 JWT_SECRET用户成功登录以后我们不希望每次接口请求都重新发送验证码。所以后端会生成access_token例如eyJhbGciOiJIUzI1NiIs...这个 Token 可以理解成用户登录后获得的一张临时通行证。JWT_SECRET 就相当于后端给这张通行证盖章时使用的秘密印章。流程用户验证码登录成功 ↓ 后端使用 JWT_SECRET ↓ 生成 access_token ↓ 发送给 App以后App请求需要登录权限的API ↓ 携带 access_token ↓ 后端使用 JWT_SECRET 验证 ↓ 确认Token是真的 ↓ 获得对应 user_id十六、user_id 和 Token 的区别这个非常容易混淆。user_id表示这个用户到底是谁。例如0199c7d2-xxxx-xxxx它应该长期存在。以后AI额度 社区帖子 评论 订单 设备 用户资料都关联这个user_id。access_token表示当前这个客户端已经通过登录验证。Token 会过期可以重新生成。所以user_id 身份证号access_token 临时通行证

相关新闻

帮手如何用一句话配置消防任务

帮手如何用一句话配置消防任务

报警量下降91.95%,不是系统漏报了,而是隐患被消灭了。 这套系统是怎么做到的? 10月10日,“智防楼宇・全域联控”消防安全大模型技术沙龙举行,来自多家企业的技术与安全管理人员齐聚一堂,天云数据受邀出席…

2026/10/14 21:22:02 阅读更多 →
二、C++系列之引用

二、C++系列之引用

目录 1、引用是什么 2、引用的相关注意点 3、引用传参 1、引用是什么 C在C的基础上新增的概念有很多,引用就是其中之一。引用说白了,就是相当于给变量取个别名,变量怎么用,引用也怎么用,变量可以通过变量名获取变量…

2026/10/14 21:22:02 阅读更多 →
出海 B2B 销售情报落地:从信号到行动的三层工作流

出海 B2B 销售情报落地:从信号到行动的三层工作流

出海 B2B 销售情报落地:从信号到行动的三层工作流 前言:知道信号还不够,关键是下一步做什么 上一篇文章里,我梳理了出海 B2B 最常用的 5 个信号源:海关数据、LinkedIn 职位数据、招聘网站、技术社区和融资公告。 文…

2026/10/14 21:22:02 阅读更多 →

最新新闻

8-PSK数字通信系统Matlab仿真完整实现与误码率分析

8-PSK数字通信系统Matlab仿真完整实现与误码率分析

前阵子帮一位同学调试一套基于8-PSK调制的数字通信系统仿真项目,顺手把手头的代码整理了一遍,发现8-PSK这东西看起来只是比QPSK多了四个星座点,真正把发射端、AWGN信道、接收端解调和误码率统计完整跑通,里面还是有不少坑的。这篇…

2026/10/14 22:10:30 阅读更多 →
狼羊白菜问题的AI建模:位编码+状态搜索实战

狼羊白菜问题的AI建模:位编码+状态搜索实战

简介:本资源是一份面向人工智能与算法入门学习者的经典逻辑推理题详解文档,聚焦“农夫带狼、羊、白菜过河”这一状态空间搜索典型问题,适用于计算机科学课程设计、AI基础算法实训及编程思维训练场景。文档系统阐述了问题建模方法(…

2026/10/14 22:10:30 阅读更多 →
Agent工程栈落地实践:任务编排、工具调用与状态管理

Agent工程栈落地实践:任务编排、工具调用与状态管理

1. 从五条动态里拆出来的工程信号10月7日那天,我刷到一位长期跟踪智能体方向的从业者连发了五条动态。内容不算长,但信息密度很高——没有一条在讲模型参数又涨了多少,全都在聊“怎么把一堆能力串起来跑通”。这个信号其实比任何单点技术突破…

2026/10/14 22:10:30 阅读更多 →
ASP.NET C/S架构邮件收发系统:SMTP/POP3协议实现与毕设实战

ASP.NET C/S架构邮件收发系统:SMTP/POP3协议实现与毕设实战

简介:本资源为计算机专业毕业设计参考项目,主题是基于ASP.NET与C/S架构的电子邮件简单收发系统,面向需要完成毕设或课程设计的高校学生及.NET初学者。项目围绕SMTP与POP3协议实现邮件发送与接收,并包含用户注册、地址簿管理&#…

2026/10/14 22:10:30 阅读更多 →
JPG转MIF/TXT/COE:FPGA图像初始化文件的Matlab生成指南

JPG转MIF/TXT/COE:FPGA图像初始化文件的Matlab生成指南

做FPGA图像处理的人,迟早会被同一个问题拦住:手里有一张JPG图片,怎么把它变成FPGA里ROM能认识的数据?这种需求太常见了——图像采集模块要仿真、边缘检测算法要输入测试图、神经网络加速模块要加载权重,甚至做一个简单…

2026/10/14 22:10:30 阅读更多 →
2026年青岛栈桥怎么玩?本地人推荐这5家必吃馆子

2026年青岛栈桥怎么玩?本地人推荐这5家必吃馆子

每年夏天,青岛栈桥总是游人如织。但说实话,大部分游客的体验都停留在“看海、拍照、吃烧烤”三件套,真正能吃到青岛本地味道的,少之又少。作为在青岛生活多年的“老土著”,今天不聊景点路线,就聊吃——栈桥…

2026/10/14 22:09:29 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →