nest.js + sms 实现短信验证码登录

faa4ee6149289b72b5ac469a2e901fe7.png

hi, 大家好, 我是徐小夕, 新的一年, 你又博学了吗?

今天和大家分享一下使用 nodejs 实现短信验证码登录的方案, 通过对该方案的实现大家可以可以对 nodejs 及其相关生态有一个更深入的理解.

好啦, 话不多说, 我们开始实现.

实现方案

为了更高效的开发 nodejs 应用, 这里我选择 nest.js 作为服务端框架, 同时使用腾讯云的短信服务:

8d82c5b42614e80b09900a3be7210e9b.png

具体实现流程如下:

a249f1c6e74a955a9bf7e12df94b6965.png

详细流程如下:

  1. 用户访问网站登录页面, 输入手机号触发验证码

  2. node服务器收到请求后, 拼接所需参数(具体在下文会详细介绍), 请求第三方短信服务平台

  3. 第三方短信服务平台校验, 通过后下发对应短信

  4. 用户在网站输入收到的验证码, 请求登录接口完成登录

相信大家对第一步没有太大疑问, 接下来我详细介绍几个核心的实现过程.

1. 短信服务的配置流程

由于我使用的是腾讯云的短信服务, 所以需要按照约定来完成以下配置:

  • 创建短信签名

5c2acab13cb47cf4e3bf0139ce2c4b81.png

发送短信内容时必须带签名.

  • 创建短信模版

240d968cd9d0c060e8662db4797419d3.png短信模版可以让我们创建自定义的短信内容, 还可以创建动态内容, 大家感兴趣可以研究一下.

  • 创建应用(一般使用默认即可)

f2b4a17958498056b3b68dcb09ffada5.png
2. nodejs服务器向短信服务平台发起短信调用

以上配置完成并审核通过之后, 我们就可以使用 nodejs 愉快的发送短信了. 这里我们需要安装腾讯云的sdk:

# nest项目中
npm install tencentcloud-sdk-nodejs --save

然后在 nest 服务端存储上一步获取的:

  • 用户手机号

  • SmsSdkAppId(应用id)

  • TemplateId(模版id)

  • SignName(签名内容)

  • TemplateParamSet(需要发送的验证码)

核心代码如下:

/**
   * 发送手机验证码
   * @param params 请求体
   */
   async registerCode(params: any): Promise<any> {
    const { phone } = params;
    if (!phone) {
      return {
        code: 400,
        msg: '手机号为空',
      };
    }

    const code = `${rand(1000,9999)}`;
    phoneCodeList[phone] = code;

    const smsParams = {
      "PhoneNumberSet": [
        `+86${phone}`
      ],
      "SmsSdkAppId": "xxxxx",
      "TemplateId": "12*****",
      "SignName": "dooring服务",
      "TemplateParamSet": [code]
    };

    try {
      const result = await client.SendSms(smsParams);
      if(result?.SendStatusSet.Code === 'Ok') {
        return {
          code: 200,
          msg: 'Success',
        };
      }else {
        return {
          code: 500,
          msg: `Service error: ${result?.SendStatusSet.Message}`,
        };
      }
    }catch(err) {
      return {
        code: 500,
        msg: `Service error: ${err}`
      };
    }
  }

以上是用 nest 写的一个简单的 service 逻辑, 主要功能是发送用户手机号和签名参数到第三方短信平台, 下发短信. TemplateParamSet字段为一个数组, 数组长度取决于我们的短信模版中动态变量的配置, 如下:

3ee1b2e4eaf084207d1b4b1422141da8.png

如果我们配置的模版内容中有2个变量, 那么TemplateParamSet字段 的数组为2项.

3. nodejs实现短信验证码验证

最后一步比较简单. 我们只需要把用户填写的验证码和我们服务器生成的验证码进行比对即可, 我们可以使用 redis 来缓存验证码.

最终的实现效果如下:

155bce99dc7b121b2d829d396c002c19.png

当然大家可以用自己熟悉的任何 nodejs 框架来实现以上功能(如koa, egg).

更多推荐

好啦, 今天的分享就到这啦, 如果文章对你有帮助, 欢迎 「点赞」 + 「在看」, 鼓励作者创造更优质的内容~

1ce109fd3c528f76e8e23a84c47529a1.png

点个在看你最好看

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值