首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >serverless+腾讯云短信实现短信验证码登录

serverless+腾讯云短信实现短信验证码登录

原创
作者头像
腾讯即时通信IM
修改于 2020-05-21 02:19:37
修改于 2020-05-21 02:19:37
17.8K0
举报
文章被收录于专栏:即时通信IM即时通信IM

云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助我们在无需购买和管理服务器的情况下运行代码。 本文会演示使用serverless云函数开发一个短信验证码登录注册服务。

传统开发协作流程(多角色参与): 1.后台开发:短信接口发送短信API、校验短信验证码是否有效API、存储用户验证状态 2.运维开发:接口部署,容灾 3.前端(客户端)开发:前端逻辑开发(调用接口,查询状态等)

传统开发模式的问题:多角色参与、工作量大、维护成本高

Serverless云函数开发模式:全流程基本上可一个人完成所有功能

这里是我们要实现的短信验证码登录的流程图,主要涉及到serverless云函数开发、短信服务、云db存储用户信息。

准备工作

相关资料

步骤1:配置短信内容

短信签名、短信正文模板提交后,我们会在2个小时左右完成审核,您可以 配置告警联系人 并设置接收模板和签名审核通知,便于及时接收审核通知。

步骤1.1:创建签名

  1. 登录 短信控制台
  2. 在左侧导航栏选择【国内短信】>【签名管理】,单击【创建签名】。

参数

取值样例

签名用途

自用(签名为本账号实名认证的公司、网站、产品名等)

签名类型

APP

签名内容

测试 Demo

证明类型

小程序设置页面截图

证明上传

  1. 单击【确定】。 等待签名审核,当状态变为【已通过】时,短信签名才可用。

步骤1.2:创建正文模板

  1. 登录 短信控制台
  2. 在左侧导航栏选择【国内短信】>【正文模板管理】,单击【创建正文模板】。

参数

取值样例

模板名称

验证码短信

短信类型

普通短信

短信内容

您的注册验证码:{1},请于{2}分钟内填写,如非本人操作,请忽略本短信。

  1. 单击【确定】。 等待正文模板审核,当状态变为【已通过】时,正文模板才可用,请记录模板 ID。

步骤2:设置短信发送频率限制(可选)

!个人认证用户不支持修改频率限制,如需使用该功能,请将 “个人认证” 变更为 “企业认证”,具体操作请参见 实名认证变更指引

为了保障业务和通道安全,减少业务被刷后的经济损失,建议 设置发送频率限制。另外,您也可以结合使用 腾讯云验证码 以便最大程度地保护业务安全。

本文以短信的默认频率限制策略为例。

  • 同一号码同一内容30秒内最多发送1条。
  • 同一手机号一个自然日最多发送10条。

步骤3:配置私有网络和子网

默认情况下,云函数部署在公共网络中,只可以访问公网。如果开发者需要访问腾讯云的 TencentDB 等资源,需要建立私有网络来确保数据安全及连接安全。

  1. 按需 规划网络

参数

取值样例

所属地域

华南地区(广州)

名称

Demo VPC

IPv4 CIDR

10.0.0.0/16

子网名称

Demo 子网

IPv4 CIDR

10.0.0.0/16

可用区

广州三区

步骤4:配置 MySQL 数据库

云数据库 MySQL 实例需与 步骤3 配置私有网络的地域和子网的可用区保持一致。

参数

取值样例

计费模式

按量计费

地域

广州

数据库版本

MySQL5.7

架构

高可用版

主可用区

广州三区

备可用区

广州四区

实例规格

4核8000MB

硬盘

200GB

网络

Demo VPC,Demo 子网

实例名

立即命名:Demo 数据库

购买数量

1

参数

取值样例

支持字符集

UTF8

表名大小写敏感

自定义端口

3306

设置 root 帐号密码

请自定义设置

确认密码

请再次输入密码

  1. 登录 MySQL 数据库,具体操作请参见 登录 phpMyAdmin
  2. 根据实际需求,创建数据表和字段用于存储用户的手机号、头像、用户昵称等信息,具体操作请参见 创建数据库和表

步骤5:新建云函数

云函数目前支持 Python、Node.js、PHP、Java 以及 Golang 语言开发,本文以 Node.js 为例。

参数

取值样例

函数名称

Demo

运行环境

Nodejs 8.9

创建方式

模板函数:helloworld

  1. 部署函数并配置触发方式为【API网关触发器】,具体操作请参见 部署函数

步骤6:配置 NAT 网关

部署在 VPC 中的云函数默认隔离外网。若想使云函数同时具备内网访问和外网访问能力,可通过以下两种方式实现:

本文以添加 NAT 网关为例。

  1. 新建 NAT 网关,具体操作请参考 私有网络中配置 NAT
  • NAT 网关要和函数、VPC 部署在同一地域。
  • NAT 网关的所属网络需要选择函数所在的 VPC。

参数

取值样例

网关名称

Demo NAT

所属网络

Demo VPC

网关类型

小型

出带宽上限

100Mbps

弹性 IP

新建弹性 IP

  1. 根据实际需求创建路由策略,具体操作请参考 私有网络中配置 NAT

步骤7:部署短信 SDK

  1. 执行以下命令,安装 SDK。npm install tencentcloud-sdk-nodejs --save
  2. 在代码中引用短信模块代码。
  3. 配置发送短信核心逻辑。
代码语言:txt
AI代码解释
复制
/**
 * 
 * @param {*} 功能:通过 SDK 发送短信 
 * @param {*} 参数:手机号、短信验证码 
 */
async function sendSms(phone, code) {
    const tencentcloud = require('tencentcloud-sdk-nodejs');
    const SmsClient = tencentcloud.sms.v20190711.Client;
    const Credential = tencentcloud.common.Credential;
    const ClientProfile = tencentcloud.common.ClientProfile;
    const HttpProfile = tencentcloud.common.HttpProfile;
    //腾讯云账户 secretId,secretKey,切勿泄露
    const secretId = "secretId";//需要配置为真实的 secretId
    const secretKey = "secretKey";//需要配置为真实的 secretKey
    let cred = new Credential(secretId, secretKey);
    let httpProfile = new HttpProfile();
    httpProfile.endpoint = "sms.tencentcloudapi.com";
    let clientProfile = new ClientProfile();
    clientProfile.httpProfile = httpProfile;
    let client = new SmsClient(cred, "ap-guangzhou", clientProfile);
    phone = "+86" + phone;//国内手机号
    let req = {
        PhoneNumberSet: [phone],//发送短信的手机号
        TemplateID: "",//<a href="#Step1_2">步骤1.2</a> 中创建并记录的模板 ID
        Sign: "",//<a href="#Step1_1">步骤1.1</a> 中创建的签名
        TemplateParamSet: [code],//随机验证码
        SmsSdkAppid: ""//短信应用 ID
    }
    function smsPromise() {
        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({
                            errorCode: 0,
                            errorMessage: response.SendStatusSet[0].Message,
                            data: {
                                codeStr: response.SendStatusSet[0].Code,
                                requestId: response.RequestId
                            }
                        })
                    } else {
                        resolve({
                            errorCode: -1003,//短信验证码发送失败
                            errorMessage: response.SendStatusSet[0].Message,
                            data: {
                                codeStr: response.SendStatusSet[0].Code,
                                requestId: response.RequestId
                            }
                        })
                    }
                }
            });
        })
    }
    let queryResult = await smsPromise()
    return queryResult
}

步骤8:检验验证码核心逻辑

验证码的时效性要求较高,您可以把验证码存在内存中或存在云数据库 Redis 中。以手机号作为 key,存储发送时间、验证码、验证次数、是否已验证过等信息。出于安全考虑,建议设置防止暴力破解的限制,本文以验证码最多验证3次为例。

代码语言:txt
AI代码解释
复制
/*
 * 功能:根据手机号获取短信验证码
 */
async function getSms(queryString) {
  const code = Math.random().toString().slice(-6);//生成6位数随机验证码
  const sessionId = Math.random().toString().slice(-8);//生成8位随机数
  const sessionCode = {
      code: code,
      sessionId: sessionId,
      sendTime: new Date().getTime(),
      num: 0,//验证次数,最多可验证3次
      used: 1//1-未使用,2-已使用
  }
  clearCacheCode()

  cacheCode[queryString.phone] = sessionCode

步骤9:配置登录模块

登录模块主要用于用户注册或登录,首次登录(即注册)时将保存用户的手机号、用户名、头像、注册时间等信息。

代码语言:txt
AI代码解释
复制
/*
* 功能:登录
*/
async function loginSms(queryString) {
  const connection = mysql.createConnection({
    host: '', // The ip address of cloud database instance, 云数据库实例 IP 地址
    user: '', // The name of cloud database, for example, root, 云数据库用户名,例如 root
    password: '', // Password of cloud database, 云数据库密码
    database: '' // Name of the cloud database, 数据库名称
  });
  connection.connect();

  if(queryString.token) {
    return await verifyToken(connection, queryString)
  }

  if(!queryString.code || !queryString.sessionId) {
    return {
        errorCode: -1001,
        errorMessage: "缺少参数"
    }
  }

  let result = cacheCode[queryString.phone]
  if(!result || result.used === 2 || result.num >= 3) {
    return {
      errorCode: -1100,
      errorMessage: "验证码已失效"
    }
  }
  if(result.sessionId !== queryString.sessionId) {
    return {
      errorCode: -1103,
      errorMessage: "sessionId不匹配"
    }
  }
  
  if(result.code == queryString.code) {
    cacheCode[queryString.phone].used = 2;//将验证码更新为已使用
    const queryInfoSql = `select * from info where phone = ?`
    let queryInfoResult = await wrapPromise(connection, queryInfoSql, [queryString.phone])
    if(queryInfoResult.length === 0) {//没有找到记录,未注册
      return await generateInfo(connection, queryString)
    } else {
      let infoResult = queryInfoResult[0]
      return {
        errorCode: 0,
        errorMessage: "登录成功",
        data: {
          phone: infoResult.phone,
          token: getToken(infoResult.userId, infoResult),
          name: infoResult.name,
          avatar: infoResult.avatar,
          userId: infoResult.userId.toString()
        }
      }
    }
  } else {
    updateCacheCode(queryString.phone, result)
    return {
      errorCode: -1102,
      errorMessage: "验证码错误,请重新输入"
    }
  }
}

另外,为了登录更便捷,您可以通过 Json web token 标准来生成 token 维护登录状态,实现短时间内登录无需短信验证码的功能。

代码语言:txt
AI代码解释
复制
/*
* 功能:利用 json web token 签发一个 token
*/
function getToken(userId, infoResult) {
  return jwt.sign({
    phone: infoResult.phone,
    userId: userId,
    name: infoResult.name,
    avatar: infoResult.avatar
  }, privateKey, {expiresIn: tokenExpireTime});
}

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
腾讯云短信服务发送验证码
  由于阿里云需要备案过的域名或者已上线的APP才能申请短信签名,我的域名正在备案,申请还没通过,这里用腾讯云实现短信验证码的发送功能。腾讯云只需要你有个公众号就能申请短信签名,而且免费赠送200条。
别团等shy哥发育
2023/02/25
9K0
腾讯云短信服务发送验证码
使用云函数构建短信验证码服务的案例
通过手机短信发送验证码,是最普遍、最安全验证用户真实身份的方式。目前,短信验证码广泛应用于用户注册、密码找回、登录保护、身份认证、随机密码、交易确认等应用场景。
haimingli
2020/12/29
4.1K0
我用Python给你发了个短信验证码,你也来试试
在互联网时代,为了保证操作的安全性,我们几乎所有的登录、注册等操作都需要用到短信验证码,一是为了防止自己的平台被机器频繁访问,加大服务压力,二是避免非本人操作带来的风险等等。验证码的服务平台有很多,他们的运行机制也都大同小异。本次分享一个对新手开发非常快捷的短信验证码方式。
润森
2019/08/29
6.7K0
我用Python给你发了个短信验证码,你也来试试
SpringBoot项目中快速集成腾讯云短信SDK实现手机验证码功能
大家春节好!我是程序员阿福,今天过年的日子祝大家在新的一年里健康平安、步步高升、虎年大吉大利、财源滚滚! 今天分享一篇简短一点的文章,希望在将来工作中需要的时候能够用得到,如果将来工作中需要实现短信验证码功能时可以打开我的公众号并翻到这篇文章再仔细参考我的实现思路,那么笔者分享这篇文章的用意也就达到了。
用户3587585
2022/03/09
4.7K1
SpringBoot项目中快速集成腾讯云短信SDK实现手机验证码功能
腾讯云短信服务实现 Java 发送手机验证码(SpringBoot+Redis 实现)
前置:需要腾讯云的账号,后期授权需要,不需要买云服务器,有需要的可以购买短信套餐(几块钱)
RAIN7
2022/08/23
3.5K0
腾讯云短信服务实现 Java 发送手机验证码(SpringBoot+Redis 实现)
Spring Security--短信验证码详解
在这一步我们需要写一个controller接收用户的获取验证码请求。注意:一定要为“/smscode”访问路径配置为permitAll访问权限,因为spring security默认拦截所有路径,除了默认配置的/login请求,只有经过登录认证过后的请求才会默认可以访问。
大忽悠爱学习
2021/12/07
1.6K0
Spring Security--短信验证码详解
云开发系列(一):实现验证码登录
终端作为所有用户的真正使用设备,终端开发者也是离用户最近的开发人员,它肩负着将后方提供的一个又一个独立服务整合为体验良好的产品的使命。面对不同的场景,所挑选的后方服务不同,实现方法也不同。
楚歌
2020/11/22
3.8K1
java实现短信验证码登陆 demo
我们使用的API平台是:秒嘀云: https://sms.miaodiyun.com/login.html
故久
2019/09/29
5.6K0
java实现短信验证码登陆 demo
【笔记整理】SpringBoot集成腾讯云短信
前言 记录一下最近使用SpringBoot基础腾讯云里的短信产品功能的体验。 1、腾讯云申请开通短信服务。 2、配置短信内容:分别创建签名、模板和群发短信。 3、使用SpringBoot工程集成测试。
pbinlog
2022/04/18
8.6K0
借助云开发实现小程序短信验证码的发送
是不是感觉实现起来特别简单,怎么说呢,我们代码调用其实就这么几行,就可以实现短信的发送,但是腾讯云短信模板的审核比较繁琐,还有我们先去申请短信模板,短信模板审核通过后才可以使用。
编程小石头
2020/01/03
4.6K0
借助云开发实现小程序短信验证码的发送
轻松集成腾讯云短信服务实现短信发送(Java实现)
不论是阿里云还是腾讯云,要想在网站上实现短信发送功能,首先得保证你的网站域名是通过备案的,因为短信签名是需要用到备案过的域名截图,所以域名通过了,申请很快就会审批成功了。 (至于备案的话,需要你先购买域名和服务器,然后提交材料信息,他们那边会打电话跟你核实下基本信息,比如你申请的域名地址,这个网站用途是什么等等,然后初审通过后,等个五六天就行)
呆呆
2021/10/09
6.8K0
个人开发者短信验证码接入方案技术分析与实践
在开发个人项目时,短信验证码是用户注册、登录验证等场景的必需功能。然而,传统短信服务提供商大多要求企业资质,给个人开发者造成了技术实现上的困难。本文将从技术角度分析这一问题,并分享一些实用的解决方案。
外滩首席运维
2025/06/09
1760
简单几步,用云开发搞定短信验证码登录
短信验证码登录支持在客户端使用短信验证码进行登录,封装了短信验证码的生成、发送、校验和定时清理逻辑,帮助开发者进行鉴权。登录成功后,用户身份将转化为正式用户。
腾讯云开发TCB
2020/09/08
2.2K0
小程序短信验证码登录,1分钟实现小程序发短信功能,借助云开发10行代码实现短信验证码登录小程序
刚知道云开发支持发短信功能,然后就迫不及待的来尝下鲜。进入官方文档一看,云开发给咱们开发者的福利还真不小。
编程小石头
2021/01/26
2.5K0
cat监控实现腾讯云短信告警
CAT(Central Application Tracking),是基于 Java 开发的分布式实时监控系统。CAT在基础存储、高性能通信、大规模在线访问、服务治理、实时监控、容器化及集群智能调度等领域提供业界领先的、统一的解决方案。CAT 目前在美团的产品定位是应用层的统一监控组件。
GavinWang
2020/05/28
11.2K0
短信验证码登录
3.进入leancloud官网https://leancloud.cn/ a.点击右上角控制台
PHP开发工程师
2021/04/19
14.6K0
短信验证码登录
2024小程序短信验证码登录,1分钟实现小程序发短信功能,借助云开发10行代码实现短信验证码登录小程序
之前发过一篇小程序发送短信的文章,但是官方技术更新太快了,又改了规则和 代码了,所以今天新写一篇文章,教大家如何使用小程序云开发发送短信。
编程小石头
2025/04/27
3520
2024小程序短信验证码登录,1分钟实现小程序发短信功能,借助云开发10行代码实现短信验证码登录小程序
Fdog系列(三):使用腾讯云短信接口发送短信,数据库写入,部署到服务器,web收尾篇。
Fdog系列(一):思来想去,不如写一个聊天软件,那就从仿QQ注册页面开始吧。 Fdog系列(二):html写完注册页面之后怎么办,用java写后台响应呀。
花狗Fdog
2021/05/06
2.6K0
Springboot整合腾讯云短信实现系统短信登录与注册
一个登录模块,无非就是一个鉴权。现代社会,大家手机不离身,使用手机进行鉴权,并完成后续单点登录,无疑是一个不错的方法。
Mintimate
2022/03/10
7.7K0
Springboot整合腾讯云短信实现系统短信登录与注册
微信小程序 获取 手机验证码 短信验证码 后端功能实现解析
本文原创首发CSDN,链接 https://mp.csdn.net/console/editor/html/106041472 ,作者博客https://blog.csdn.net/qq_41464123 ,转载请带上本段内容,尤其是脚本之家、码神岛等平台,谢谢配合。 ----
Designer 小郑
2023/08/01
1.8K0
微信小程序 获取 手机验证码 短信验证码 后端功能实现解析
推荐阅读
相关推荐
腾讯云短信服务发送验证码
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档