如何通过腾讯云短信实现发送验证码并校验验证码以实现登录功能

验证码相关的10种技术

  1. 图像处理技术:生成、识别、验证验证码的图像。
  2. 机器学习技术:让计算机自动学习并识别验证码。
  3. 文字识别技术:将图像中的文字转换成计算机可读的文本。
  4. 模式识别技术:识别验证码中的模式及规律。
  5. 图像噪声处理技术:去除图像中的噪声干扰。
  6. 前端技术开发:为用户提供验证码输入界面。
  7. 后端技术开发:为验证码生成、识别、验证提供服务。
  8. 数据库技术:存储验证码及相关数据。
  9. 安全技术:防止验证码被人类或机器暴力破解。
  10. 人工智能技术:让计算机自动调整验证码以对抗破解尝试。

函数代码:


/**************************************************
* 功能:1.发送短信 2.登录(校验短信验证码)
* 函数运行的前提条件:
1.创建模板函数后,请先添加函数运行角色,并给该角色关联短信QcloudSMSFullAccess权限。
2.本服务用到redis存储验证码,请先申请redis资源,并将redis的host和密码设置成环境变量。
3.去云短信控制台申请短信模板和签名
* 详细请参考:https://github.com/tencentyun/scf-demo-repo/tree/master/Nodejs8.9-SmsVerificationCode
***************************************************/'use strict';
const redis = require('ioredis');
const tencentcloud = require('tencentcloud-sdk-nodejs');
const queryParse = require('querystring')
const expireTime = 5 * 60;//验证码有效期5分钟exports.main_handler = async (event, context, callback) => {let queryString = event.queryString // get形式if(event.httpMethod === "POST") { // post形式queryString = queryParse.parse(event.body)}if(!queryString || !queryString.method || !queryString.phone) {return {codeStr: 'InValidParam',msg: "缺少参数"}}const redisStore = new redis({port: 6369, // Redis instance port, redis实例端口host: process.env.REDIS_HOST, // Redis instance host, redis实例hostfamily: 4,password: process.env.REDIS_PASSWORD, // Redis instance password, redis实例密码db: 0});if(queryString.method === "getSms") {return await getSms(queryString, redisStore)} else if(queryString.method === "login") {return await loginSms(queryString, redisStore)}
}/*
* 功能:登录,校验验证码
*/
async function loginSms(queryString, redisStore) {if(!queryString.code) {return {codeStr: 'MissingCode',errorMessage: "缺少验证码参数"}}const redisResult = await redisPromise(redisStore, queryString)if(!redisResult) {//没有找到记录return {codeStr: 'CodeHasExpired',msg: "验证码已过期"}}let result = JSON.parse(redisResult)if(!result || result.used || result.num >= 3) {return {codeStr: 'CodeHasValid',msg: "验证码已失效"}}if(result.code == queryString.code) { //验证码校验正确updateRedis(redisStore, queryString.phone, result, true) //将验证码更新为已使用// 验证码校验通过,执行登录逻辑console.log('校验验证码成功')return {codeStr: 'Success',msg: '校验验证码成功'}} else { // 验证码校验失败updateRedis(redisStore, queryString.phone, result, false)return {codeStr: 'CodeIsError',msg: "请检查手机号和验证码是否正确"}}
}
// 更新redis状态
function updateRedis(redisStore, phone, result, used) {const sessionCode = {code: result.code,sessionId: result.sessionId,num: ++result.num, //验证次数,最多可验证3次used: used //true-已使用,false-未使用}redisStore.set('sms_' + phone, JSON.stringify(sessionCode));if(used) {redisStore.expire('sms_' + phone, 0);} else {redisStore.expire('sms_' + phone, expireTime);}
}
/** 功能:根据手机号获取短信验证码*/
async function getSms(queryString, redisStore) {const code = Math.random().toString().slice(-6);//生成6位数随机验证码const sessionCode = {code: code,num: 0, //验证次数,最多可验证3次used: false //false-未使用,true-已使用}redisStore.set('sms_' + queryString.phone, JSON.stringify(sessionCode));redisStore.expire('sms_' + queryString.phone, expireTime);let queryResult = await sendSms(queryString.phone, code)return queryResult
}
/** 功能:通过sdk调用短信api发送短信* 参数 手机号、短信验证码*/
async function sendSms(phone, code) {const SmsClient = tencentcloud.sms.v20190711.Client;const Credential = tencentcloud.common.Credential;const ClientProfile = tencentcloud.common.ClientProfile;const HttpProfile = tencentcloud.common.HttpProfile;const secretId = process.env.TENCENTCLOUD_SECRETID;const secretKey = process.env.TENCENTCLOUD_SECRETKEY;const token = process.env.TENCENTCLOUD_SESSIONTOKEN;let cred = new Credential(secretId, secretKey, token);let httpProfile = new HttpProfile();httpProfile.endpoint = "sms.tencentcloudapi.com";let clientProfile = new ClientProfile();clientProfile.httpProfile = httpProfile;let client = new SmsClient(cred, "ap-guangzhou", clientProfile);let req = {PhoneNumberSet: ["+" + phone], //大陆手机号861856624****TemplateID: process.env.SMS_TEMPLATE_ID, //腾讯云短信模板idSign: process.env.SMS_SIGN, //腾讯云短信签名TemplateParamSet: [code],SmsSdkAppid: process.env.SMS_SDKAPPID //短信应用id}let queryResult = await smsPromise(client, req)return queryResult
}async function smsPromise(client, req) {return new Promise((resolve, reject) => {client.SendSms(req, function(errMsg, response) {if (errMsg) {reject(errMsg)} else {if(response.SendStatusSet && response.SendStatusSet[0] && response.SendStatusSet[0].Code === "Ok") {resolve({codeStr: response.SendStatusSet[0].Code,msg: response.SendStatusSet[0].Message})} else {resolve({codeStr: response.SendStatusSet[0].Code,msg: response.SendStatusSet[0].Message})}}                });})
}async function redisPromise(redisStore, queryString) {return new Promise((res, rej) => {redisStore.get('sms_' + queryString.phone, function (err, result) {if (err) {rej(err)}res(result)});})
}

如何通过腾讯云短信实现发送验证码并校验验证码以实现登录功能相关推荐

  1. 腾讯云短信服务发送验证码

    腾讯云短信服务发送验证码 1.前言 2.进入短信服务控制台 3.创建签名 4.创建模板 5.短信-应用管理-应用列表 6.创建密钥 7.SpringBoot实现短信验证码发送 7.1 引入依赖 7.2 ...

  2. Python使用腾讯云-短信服务发送手机短信

    原创不易,欢迎关注我的微信公众号:司马弈 获取更多精选内容. 腾讯云短信服务介绍 目前[腾讯云短信]为客户提供[国内短信].[国内语音]和[海外短信]三大服务,腾讯云短信SDK支持以下操作: 国内短信 ...

  3. 【SpringBoot深入浅出系列】SpringBoot之调用腾讯云短信接口发送短信

    目录 一.开发前准备 1.创建签名 2.创建正文模板管理 3.创建应用 4.创建secretId和secretKey 二.开发 1.创建 Spring Initializr 项目 tengxunsms ...

  4. 【使用腾讯云短信服务发送短信】

    有账号直接登录腾讯云,没有账号注册之后登录 搜索短信,点击进入短信控制台 点击免费使用进入控制台,按照概览中的流程操作 创建短信签名,腾讯云支持使用个人公众号创建短信签名,而且有免费条数可以使用,信息 ...

  5. php发送腾讯云变量短信源码,php结合腾讯云短信实现发送短信功能!(群发和单发都可以)...

    namespace app\home\controller; use core\basic\Controller; use core\basic\Smsnotice; use app\home\mod ...

  6. 短信接口在本地调试正常_Pivotal实践:腾讯云短信小应用

    最近登录了一下腾讯云控制台,发现账户下居然每月有100条免费短信可以使用.结合一下最近成都阴晴不定的天气,女友上班老是忘记带伞的现状,于是决定开发一款天气短信提醒小应用,每天早上定时给女友发送天气状况 ...

  7. Java后端利用腾讯云短信服务发短信

    利用手机验证码进行注册或进行下一步操作已经是非常普遍的,这篇文章就教你如何是用腾讯云短信服务发送手机验证码. 文章目录 一.前提条件 二.代码实现 1.引入依赖 2.Java代码实现 3.代码改进 4 ...

  8. 腾讯云短信服务实现 Java 发送手机验证码(SpringBoot+Redis 实现)

    文章目录 腾讯云短信服务实现 Java 发送手机验证码(SpringBoot+Redis 实现) 1.打开腾讯云短信服务 2.创建短信签名 3.创建短信正文模板 4.等待全部审核完毕即可 5.发送短信 ...

  9. 腾讯云短信服务——获取验证码

    引言 之前介绍过阿里云短信服务,传送门:阿里云短信服务--短信发送验证码,但是由于阿里云现在短信调用门槛较高,申请有很多限制(我申请好几次都没有通过),所以只能使用测试账号给固定的手机号发送验证码,自 ...

最新文章

  1. 网络流最大流 Dinic算法模板
  2. Tunnel Warfare(HDU1540+线段树+区间合并)
  3. Factory Method(工厂方法)--对象创建型模式
  4. 略读《大教堂与市集》
  5. 80-200-040-原理-MySQL服务端架构
  6. php导入qq数据txt代码,/谁有能都实现将excel文件导入到数据中,并在php网页上显示的源码啊,有的发送1091932879@qq.com,谢谢!...
  7. 笔记:Gitlab-CI部署流程
  8. 洛谷——P1024 [NOIP2001 提高组] 一元三次方程求解
  9. mysql be_Amobe实现MySQL读写分离
  10. 三星note3 android4.3,真的8核全开了!Exynos版GS4升级安卓4.3
  11. h710阵列卡支持最大硬盘_ORICO推爆品五盘位硬盘柜,一拖五最大支持80TB,你会买吗?...
  12. MySQL入门02-MySQL二进制版本快速部署
  13. Office在线预览,PPT在线预览,word在线预览,Excel在线预览,PDF在线预览
  14. ResNet 网络结构与残差连接介绍
  15. 计算机绘图 cad),CAD计算机绘图入门
  16. matlab fspecial 位置,matlab fspecial 用法解释
  17. [Android Traffic] android 流量计算方法
  18. 高旭东:科普返利网站模式,做到知己知彼放心购物!
  19. Ansible tags 的用法详解
  20. jzoj 4246【五校联考6day2】san

热门文章

  1. 微信8.0状态视频素材免费下载
  2. 江苏计算机vfp二级常用知识,考江苏计算机二级VFP要看什么书?
  3. Flex中实时动态加载(图像swf)皮肤的方法
  4. HTML5:新增属性draggable
  5. Java 读取PDF中表格的工具
  6. python爬虫进阶:异步请求几秒钟爬光网站的全部美女图片
  7. correcting error in index $I30 for file 11031
  8. 传智播客python培训班 青岛
  9. 计算机科学家李蕴瑶,清华学子音乐趣谈 吕建强.pdf
  10. JWT 快速入门,并实现登录认证