【后端学习笔记·Golang】邮箱邮件验证

news/2024/5/15 13:32:09

文章目录

  • 邮箱登陆验证
    • 生成随机验证码
    • 向用户邮箱发送验证码
    • 接口
      • 获取验证码
      • 校验验证码

邮箱登陆验证

流程:

  • 接收用户请求后生成随机验证码,并将验证码存入Redis中,并设置TTL

  • 通过gomail发送验证码给用户邮箱

  • 接收用户输入的验证码,与Redis中存放的验证码进行比对

生成随机验证码

​ 随机种子通过 time.Now().UnixNano() 进行设置,以确保对于同一个用户每次请求都使用不同的种子。然后,定义了一个包含数字字符的 letters 切片。每次通过 rand.Intn(len(letters)) 随机选择 letters 切片中的一个字符,并将其存储在 b 中。最后,将 b 转换为字符串并返回。

import ("math/rand""time"
)
func GenerateRandomCode(length int) string {rand.Seed(time.Now().UnixNano())var letters = []rune("0123456789")b := make([]rune, length)for i := range b {b[i] = letters[rand.Intn(len(letters))]}return string(b)
}

向用户邮箱发送验证码

  • 这里使用了gomail进行发送邮箱验证码。gomail package - gopkg.in/gomail.v2 - Go Packages
  • 此处密码为授权码而非登陆密码,以qq为例:需要在邮箱设置->账号安全->POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务处开启服务,然后获取授权码
  • Host:SMTP 服务器的主机地址。
  • Port:SMTP 服务器的端口号。
  • Username:SMTP 服务器的邮箱账号。
  • Password:SMTP 服务器的密码。
# qq邮箱
host: smtp.qq.com
port: 587
username: ********@qq.com
password: ********
// 发送邮箱验证码
func EmailSendCode(ctx context.Context, email string) (code string, err error) {// 生成6位随机验证码code = vcode.GenerateRandomCode(6)m := gomail.NewMessage()m.SetHeader("From", cfg.username)m.SetHeader("To", email)m.SetHeader("Subject", "验证码")msg := fmt.Sprintf("您的验证码为: %s", code)m.SetBody("text/html", msg)d := gomail.NewDialer(cfg.host, cfg.port, cfg.username, cfg.password)err = d.DialAndSend(m)return
}

接口

Goframe 框架

获取验证码

​ 如果发送验证码成功,将验证码存储到 Redis 中。这里 使用SETEX 命令设置了一个键值对,键以邮箱地址为后缀,值是验证码,过期时间设置为 120 秒(2 分钟)。(Goframe框架)

func (c *ControllerV1) SendCode(ctx context.Context, req *v1.SendCodeReq) (res *v1.SendCodeRes, err error) {res = &v1.SendCodeRes{}code, err := email.EmailSendCode(ctx, req.Email)if err != nil {return}// 将验证码存入Redis中,并设置TTL_, err = g.Redis().Do(ctx, "SETEX", fmt.Sprintf("code.%s", req.Email), 120, code)if err != nil {return}res.States = truereturn
}

校验验证码

​ 检查请求中是否包含验证码。如果验证码非空,则从 Redis 中获取之前发送给该邮箱的验证码,并与请求中的验证码进行比较。如果验证码不匹配,则返回一个错误。验证码正确则查询用户信息,用用户的唯一标识符获取 JWT 令牌。最后,将 JWT 令牌包装在响应对象中返回。

func (c *ControllerV1) Login(ctx context.Context, req *v1.LoginReq) (res *v1.LoginRes, err error) {user := entity.User{Email:    req.Email,}if req.VerificationCode != "" {search, _ := g.Redis().Do(ctx, "GET", fmt.Sprintf("code.%s", req.Email))code := search.String()if code != req.VerificationCode {return res, gerror.New("验证码错误或未发送")}}// 查询用户信息search, err := service.User().UserInfo(ctx,user)if err != nil {return}// 保存jwt令牌token, _ := service.JwtStorage().GetJwtAndSave(ctx, search.Id)res = &v1.LoginRes{Token: token,}return
}

http://www.mrgr.cn/p/20633710

相关文章

Python数组类+AI插件

目录 规划实现初始化插入删除查找 AI插件单测注释调优建议 小结 规划 先想清楚都写哪些,然后再动手操作 用Python写了一个简单数组类,首先思考下都写哪些功能: 插入删除查找用插件做单元测试和写注释 目的只是实现一个简单的数组类&#x…

openGauss MOT内存和存储规划

MOT内存和存储规划 本节描述了为满足特定应用程序需求,在评估、估计和规划内存和存储容量数量时,需要注意的事项和准则,以及影响所需内存数量的各种数据,例如计划表的数据和索引大小、维持事务管理的内存以及数据增长的速度。 MOT内存规划 MOT是一种内存数据库存储引擎(IM…

Strassen矩阵乘法——C++

【题目描述】 根据课本“Strassen矩阵乘法”的基本原理,设计并实现一个矩阵快速乘法的工具。并演示至少10000维的矩阵快速乘法对比样例。 【功能要求】 实现普通矩阵乘法算法和“Strassen矩阵乘法”算法对相同的矩阵,分别用普通矩阵乘法算法&#xff…

机器学习:基于Sklearn、XGBoost框架,使用逻辑回归、支持向量机和XGBClassifier预测帕金森病

前言 系列专栏:机器学习:高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目,每个项目都处理一组不同的问题,包括监督和无监督学习、分类、回归和聚类,而且涉及创建深度学…

openGauss MOT性能基准

MOT性能基准 我们的性能测试是基于业界和学术界通用的TPC-C基准。 测试使用了BenchmarkSQL(请参见MOT样例TPC-C基准),并且使用交互式SQL命令而不是存储过程来生成工作负载。说明: 使用存储过程方法可能会产生更高的性能结果,因为它需要大大减少网络往返和数据库封装SQL处理…

在STM32上实现无线传感器网络节点

引言 无线传感器网络(WSN)是物联网(IoT)技术的关键组成部分,广泛应用于环境监测、智能建筑、精密农业等领域。 本教程将介绍如何在STM32微控制器上设计和实现一个无线传感器网络节点,包括硬件选择、网络协…

C++ | Leetcode C++题解之第55题跳跃游戏

题目&#xff1a; 题解&#xff1a; class Solution { public:bool canJump(vector<int>& nums) {int n nums.size();int rightmost 0;for (int i 0; i < n; i) {if (i < rightmost) {rightmost max(rightmost, i nums[i]);if (rightmost > n - 1) {r…

[Diffusion Model 笔记]DDIM 笔记 数学推导 Denoising Diffusion Implicit Models

目录 核心总结符号定义第一套&#xff0c;快速简单讲清采样方法继续分析&#xff0c;待定系数法求解图示理解关于参数sigma 本文是观看以下视频的笔记&#xff0c;强烈推荐观看最后的图示理解&#xff1a; https://www.bilibili.com/video/BV13P411J7dm/?spm_id_from333.788 论…

BERT一个蛋白质-季军-英特尔创新大师杯冷冻电镜蛋白质结构建模大赛-paipai

关联比赛: “创新大师杯”冷冻电镜蛋白质结构建模大赛 解决方案 团队介绍 paipai队、取自 PAIN AI&#xff0c;核心成员如我本人IvanaXu(IvanaXu GitHub)&#xff0c;从事于金融科技业&#xff0c;面向银行信用贷款的风控、运营场景。但我们团队先后打过很多比赛&#xf…

RK3588 - RKNN(Rockchip 神经处理单元)的逆向工程

本文翻译自https://jas-hacks.blogspot.com/2024/02/rk3588-reverse-engineering-rknn.html RK3588 NPU 的内部操作和功能主要隐藏在名为RKNPU2的闭源 SDK 中。由于对大型语言模型 (LLM) 的兴趣以及对transform模型最佳矩阵乘法的追求&#xff0c;想了解 RKNPU SDK 新引入的矩阵…

openGauss 查看数据库连接数

查看数据库连接数 背景信息 当用户连接数达到上限后,无法建立新的连接。因此,当数据库管理员发现某用户无法连接到数据库时,需要查看是否连接数达到了上限。控制数据库连接的主要以下几种选项。全局的最大连接数:由运行参数max_connections指定。 某用户的连接数:在创建用…

主观赋权法、客观赋权法、组合赋权法、评价指标体系构建

在科研领域,为了对某个研究主题进行深入的探讨和评估,我们往往需要构建一套科学合理的评价体系,并为其中的各项评价指标赋予相应的权重。比如,在评价一项新技术的性能时,我们可能会考虑其创新性、实用性、成本效益等多个维度。那么,如何为这些维度赋予合适的权重,以更准…

openGauss 创建和管理分区表

创建和管理分区表 背景信息 openGauss数据库支持的分区表为范围分区表、间隔分区表、列表分区表、哈希分区表。范围分区表:将数据基于范围映射到每一个分区,这个范围是由创建分区表时指定的分区键决定的。这种分区方式是最为常用的,并且分区键经常采用日期,例如将销售数据按…

【C】---- T3:年龄转换为秒数

一年大约有$3.15610^7$秒。编写一个程序,提示用户输入年龄,然后显示该年龄对应的秒数。题目 一年大约有\(3.15610^7\)秒。编写一个程序,提示用户输入年龄,然后显示该年龄对应的秒数。 编程 #include <stdio.h>int main(void) {int Peryearseconds = 3.156e7; //定…

华为云云原生FinOps解决方案,释放云原生最大价值

华为云云原生FinOps通过可视化的成本洞察和成本优化,帮助用户精细用云以提升单位成本的资源利用率,实现降本增效目标。华为云云原生FinOps通过可视化的成本洞察和成本优化,帮助用户精细用云以提升单位成本的资源利用率,实现降本增效目标企业上云现状:上云趋势持续加深,但…

熵权(值)法计算权重原理解释综合得分纵向对比

熵值是不确定性的一种度量。信息量越大,不确定性就越小,熵也就越小;信息量越小,不确定性越大,熵也越大。因而利用熵值携带的信息进行权重计算,结合各项指标的变异程度,利用信息熵这个工具,计算出各项指标的权重,为多指标综合评价提供依据。 权重计算 熵值法的计算公式…

管家婆ERP_天通S3 卸载不干净

S3 卸载后,在电脑上已经找不到S3的任何程序的时候 ,再次安装,提示 【S3已存在,请先卸载】 的提示的时候 ,执行以下 文件就行了 【S3 技术提供】Windows Registry Editor Version 5.00 [-HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\TTERP]把以上内容保存成 *.reg 格式管理…

Apollo共创生态:共筑未来智能出行新篇章

目录 引言Apollo七周年大会回顾心路历程企业生态计划 个人心得与启发技术革新的引领者展望 结语 引言 在科技飞速发展的今天&#xff0c;智能出行已经成为全球关注的焦点。Apollo开放平台&#xff0c;作为智能出行领域的先行者&#xff0c;已经走过了七个春秋。七年磨一剑&…

Notion是什么,Notion软件下载,Notion官方网站在哪里?国内用户Notion怎么订阅升级会员?

Notion是什么,Notion软件下载,Notion官方网站在哪里?国内用户Notion怎么订阅升级会员?Notion是什么 Notion,一款强大的多功能工具,可用于组织笔记、任务、项目、数据库和文档等。Notion软件下载 这个到Notion官方网站下载就可以了。 怎么订阅Notion会员 注册好了Notion的…

计算机视觉 | 交通信号灯状态的检测和识别

Hi&#xff0c;大家好&#xff0c;我是半亩花海。本项目旨在使用计算机视觉技术检测交通信号灯的状态&#xff0c;主要针对红色和绿色信号灯的识别。通过分析输入图像中的像素颜色信息&#xff0c;利用OpenCV库实现对信号灯状态的检测和识别。 目录 一、项目背景 二、项目功能…