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

文章目录

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

邮箱登陆验证

流程:

  • 接收用户请求后生成随机验证码,并将验证码存入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.mzph.cn/diannao/3514.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Swift]组件化开发

一、组件化开发基础 1.组件定义 在软件开发中,一个组件是指一个独立的、可替换的软件单元,它封装了一组相关的功能。组件通过定义的接口与外界交互,并且这些接口隔离了组件内部的实现细节。在Swift语言中,组件可以是一个模块、一…

CVaR模型

CVaR模型(Conditional Value at Risk)是一种风险管理工具,用于衡量金融资产或投资组合在不同市场条件下的风险。CVaR模型衡量的是在某个置信水平下(通常是95%或99%)资产或投资组合在损失情况下的平均损失。与VaR&#…

车企如何利用数据技术,指导汽车全生命周期的业务运营?

引言:数据正作为重点,为行业提供不可或缺的指导 《汽车数据发展研究报告(2023)》指出,汽车行业正由传统硬件制造向“电动化、智能化、网联化”方向转变。德勤预测,到 2025 年,汽车行业 20%的利…

K8s: 部署 kubernetes dashboard

部署 Dashboard K8s 官方有一个项目叫 dashboard,通过这个项目更方便监控集群的状态 官方地址: https://github.com/kubernetes/dashboard 通常我们通过命令行 $ kubectl get po -n kube-system 能够查看到集群所有的组件,但这样的方式比较不太直观 …

【JavaScript】内置对象 ③ ( Math 内置对象 | Math 内置对象简介 | Math 内置对象的使用 )

文章目录 一、Math 内置对象1、Math 内置对象简介2、Math 内置对象的使用 二、代码示例1、代码示例 - Math 内置对象的使用2、代码示例 - 封装 Math 内置对象 一、Math 内置对象 1、Math 内置对象简介 JavaScript 中的 Math 内置对象 是一个 全局对象 , 该对象 提供了 常用的 数…

通过 QEMU 试用 ESP32-C3 的安全功能

概述 ESP32-C3 系列芯片支持可信启动、flash 加密、安全存储等多种安全功能,还有专用外设来支持 HMAC 和数字签名等用例。这些功能所需的私钥和配置大多存储在 ESP32-C3 的 eFuse 存储器中。 启用安全功能时需要谨慎,因为使用到的 eFuse 存储器是一次…

安卓studio插件开发(一)本地搭建工程

下载idea 社区版本 建立IDE Plugin工程 点击create就行,新建立的工程长这样 比较重要的文件 build.gradle:配置工程的参数 plugin.xml:设置插件的Action位置 build.gradle.kts内容如下: plugins {id("java")id(&quo…

【网络安全】安全事件管理处置 — 事件分级分类

专栏文章索引:网络安全 有问题可私聊:QQ:3375119339 目录 一、安全事件分级 二、应急事件分级 三、安全事件分类 四、常见安全事件原因分析 1.web入侵 2.漏洞攻击 3.网络攻击 一、安全事件分级 在对安全事件的应急响应过程中&#xf…

6.MMD ray渲染 材质的添加及打光方法

材质 前置准备 先准备好模型和场景 将ray控制器拖入进去 添加完默认的材质以后的效果 打开插入材质页面 打开MaterialMap栏 将流萤的模型展开 自发光 现在给领带添加一个自发光效果 在自发光Emissive里,打开x1,选择albedo,白光 现在…

OpenMesh 计算封闭网格体积

文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 思路很是简单,就是计算一些四面体的有向体积(这些四面体均是基于网格中的三角形与原点组成的) ,至于体积的符号则来自于三角形是否指向原点方向来确定,即面片的法线方向(其中三角形的法线本身取决于顶点的顺序…

80个在线小游戏源码

源码简介 搭建80个在线小游戏网站源码,解压即可食用,支持在本地浏览器打开。 安装教程 纯HTML,直接将压缩包上传网站目录解压即可 首页截图 源码下载 80个在线小游戏源码-小8源码屋

BGP的基本概念和工作原理

AS的由来 l Autonomous System 自治系统,为了便于管理规模不断扩大的网络,将网络划分为不同的AS l 不同AS通过AS号区分,AS号取值范围1-65535,其中64512-65535是私有AS号 l IANA机构负责AS号的分发 AS之…

【Vue】通过Axios实现异步通信(简单案例)

一、Axios介绍 1、是什么 Axios 是一个基于 promise 的 HTTP 库,简单的讲就是可以发送get、post请求。当然这些请求ajax和jquery也能做,但是由于Vue、React等框架的出现,促使了Axios轻量级库的出现,因为Vue等,不需要操…

LabVIEW专栏九、类的应用

一、类的应用 接上一章"类" 类在项目中,一般会在类的私有成员簇内,包含一个数据类型为参数类的队列。 例如网口类,里面实际会包含很多信息,有IP地址和端口等等参数。这些参数如果不放在队列引用中缓存下来,…

HarmonyOS开发实战(黑马健康系列一:欢迎页)

系列文章目录 (零)鸿蒙HarmonyOS入门:如何配置环境,输出“Hello World“ (一)鸿蒙HarmonyOS开发基础 (二)鸿蒙HarmonyOS主力开发语言ArkTS-基本语法 (三)鸿蒙…

git commit 不进入 Vim 编辑模式,提示 ihint: Waiting for your editor to close the file...

git commit 不进入 Vim 模式问题 输入 git commit 后 提示 ihint: Waiting for your editor to close the file... 然后自动退出提交。 一般是 git 默认编辑器使用了其他的 如 cat // 用此命令查看当前默认编辑器 git config --get core.editor cat解决方法&#xff1a…

【Qt QML】TabBar的用法

Qt Quick中的TabBar提供了一个基于选项卡的导航模型。TabBar由TabButton控件填充,并且可以与任何提供currentIndex属性的布局或容器控件一起使用,例如StackLayout或SwipeView。 import QtQuick import QtQuick.Controls import QtQuick.LayoutsWindow …

AWS SES发送邮件如何正确配置?操作指南?

AWS SES发送邮件有哪些限制?AWS SES发信的注意事项? AWS SES作为亚马逊云服务提供的一项高效、可靠的电子邮件发送服务,受到了众多企业的青睐。然而,如何正确配置AWS SES发送邮件。AokSend将详细解析AWS SES发送邮件的配置过程&a…

MIS微调SAM模型实时交互UI界面

前言 SAM模型的基本介绍可见SAM(Segment Anything Model)大模型使用--point prompt_sam大模型-CSDN博客 针对Meta团队去年发布的SAM大模型在医学图像分割领域表现性能较差的情况,笔者收集了一些MIS领域的数据集对SAM的架构进行fine tune&am…