华为函数工作流云函数操作云MySQL数据库实现邮箱验证码发送以及校验

举报
代码哈士奇 发表于 2021/03/24 15:10:55 2021/03/24
【摘要】 华为云函数操作云MySQL数据库实现邮箱验证码发送以及校验

云函数环境为 nodejs12.13
云数据库为MySQL数据库
云数据库开通使用不再多提 购买云数据库即可
不再使用dmhsq-mysql-db改为 dmhsq-mysql-pool

部署邮件发送服务

上一篇文章 我们已经讲了 如何实现邮件发送
使用华为云函数实现邮件发送

配置数据库

这里我用的 navicat fro mysql
表结构如下
email 邮箱
code 验证码
state 状态
check_time 过期时间

图片.png

state为0为未验证
state为1为已经验证 代表失效
check_time大于当前时间则为有效 小于为已经失效
本地安装依赖

重复上个文章我们本地安装依赖再上传代码

npm install dmhsq-mysql-pool
npm install nodemailer

index.js文件编写逻辑

首先 用户如果只输入邮箱 则为 获取验证码
验证码生成 并进入数据库
发送邮件
如果用户 输入了邮箱和验证码 则进行校验
取最新验证码进行校验
如果已经校验就返回已经验证
如果未验证就校验
如果检验失败看看是否超时 超时为失效
剩下的情况为验证码输入错误

代码如下

const transporter = require("./email.js")
const database = require("dmhsq-mysql-pool")
exports.handler = async function(event, context, callback) {

	let email = event.queryStringParameters.email;
	let code = event.queryStringParameters.code
	let db = new database({
		host: 'xxxx',
		port: 'xxxx',
		user: 'xxxx',
		password: 'xxxx',
		database: "xxxx"
	})
	let collection = db.table("email")
	let response = {
		'statusCode': 200,
		'isBase64Encoded': false,
		'headers': {
			'Content-type': 'application/json'
		},
		'body': `'{"key": ${JSON.stringify(event.queryStringParameters)}}'`
	}

	if (!email) {
		response.body = `'{"key": "请输入正确邮箱"}'`
		callback(null, response);
	} else if (!code) {
		
		const randomStr = '00000' + Math.floor(Math.random() * 1000000)
		const codes = randomStr.substring(randomStr.length - 6)
		const time = 300;
		const check_time = parseInt(Date.parse(new Date()).toString().substr(0, 10))+time;
		
		let d = await collection.add({
			email,
			code: codes,
			check_time,
			state:0
		}).get()
		if(d.code===0){
			response.body = `{"code": 0}`
			const message = {
						  from: "验证码<xxxxxx@xx.com>",
						  to: email,
						  subject: "验证码服务",
						  html: `<html>
						<head>
							<meta charset="utf-8">
							<title></title>
						</head>
						<body>
							<div>
								<p style="font-size: 20px;">欢迎您使用,您的验证码为 
								<span style="color: blue;font-size: 30px;font-weight: 800;">${codes}</span> ,有效时间为${time/60}分钟, 请勿泄露并及时验证</p>
	
								<div style="margin-top: 50px;"></div>
								<p style="color: red;font-size: 25px;">请勿回复</p>
							</div>
						</body>
					</html>`
					};
					await transporter.sendMail(message)
		}else{
			response.body = `{"msg": 请稍后重试}`
		}
		callback(null, response);
	}else{
		let result = await collection.where({email,code}).sort({check_time:"DESC"}).get();
		let data = result.data;
		if(data.length==0){
			response.body = `{"key": "验证码错误"}`
		}else{
			data = data[0]
			const check_times = parseInt(Date.parse(new Date()).toString().substr(0, 10));
		if(data.state==0&data.check_time>check_times){
			await collection.updata({state:1}).where({email}).get()
			response.body = `{"key": "验证通过"}`
		}else if(data.check_time<check_times){
			response.body = `{"key": "验证码失效"}`
		}else if(data.state==1){
			response.body = `{"key": "验证码已经验证"}`
		}else{
			response.body = `{"key": "验证码错误"}`
		}
		}
		
		callback(null, response);
	}

	callback(null, response);
}

创建触发器

图片.png

测试

这里在浏览器中使用触发器提供的地址即可

发送请求
图片.png

收到邮件
图片.png

验证
图片.png

再次验证
图片.png

失效
图片.png

数据库数据
图片.png

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。