[노드] 노드 + SMS API로 인증 코드 로그인 달성

함유량

노드 서버 로그인 인터페이스는 실제 SMS를 사용하여 로그인을 확인합니다.

1. 노드 서버 구축 + 데이터베이스 연결

여기의 작업은 더 간결하고 이해하기 쉽습니다. 참조 할 수 있습니다. 노드 서버 빠른 설정

2. SMS API 사용

SMS api의 경우 Alibaba Cloud의 SMS 서비스를 예로 들어 보겠습니다. (SMS 서비스가있는 플랫폼이라면 사용할 수 있습니다)

2.1 매개 변수 구성을 위해 플랫폼에 로그인

1. SMS 콘솔에 들어가서 보낼 SMS의 형식을 설정하고, 서명이없는 경우에는 서명을 신청하고 운영해야합니다.
여기에 사진 설명 삽입

2. View API Demo를 클릭하여 구성에 의해 생성 된 api를 입력하고 이때 Node.js를 선택합니다.

여기에 사진 설명 삽입

2.2 생성 된 API에 따라 프로젝트에서 사용

자세한 코드 주석

const Core = require('@alicloud/pop-core'); //cwen 调用阿里短信模块(需先安装)
//cwen 对阿里短信服务API进行配置
let client = new Core({
    
    
  accessKeyId: '<accessKeyId>', // 需要先申请(步骤在下文)
  accessKeySecret: '<accessSecret>', // 需要先申请(步骤在下文)
  endpoint: 'https://dysmsapi.aliyuncs.com', //无需更改
  apiVersion: '2017-05-25' //无需更改
});
//cwen 请求方式
let requestOption = {
    
    
    method: 'POST'
};

//# 生成随机四位数,模拟验证码
function rander(max, min) {
    
    
    return Math.floor(Math.random() * (max - min)) + min
}
//# 存储手机号+验证码(方便验证)
var loginInfo = [];
//# 验证手机号是否已经发送个验证码
let validate = (phone) => {
    
    
    return loginInfo.some(item => item.phone === phone)
}
//# 验证验证码是否一致
let validateCode = (phone, code) => {
    
    
    return loginInfo.some(item => (item.phone === phone && item.code == code))
}

//cwen 用阿里云api发送短信验证(验证码登录)
let sendLoginCroeCode = async(req, res) => {
    
    
    let {
    
     phone } = req.body;
    let randCode = rander(1000, 9999);
    var params = {
    
    
            "RegionId": "cn-hangzhou",
            "PhoneNumbers": phone, // 客户端手机号
            "SignName": "小陈应用ya", //签名
            "TemplateCode": "SMS_197625305", //模板,用于发送文字信息
            "TemplateParam": JSON.stringify({
    
     'code': randCode }) //指定要发送的验证码(此处以rander 函数为例)
        }
          //# 发送验证码之前判断手机号是否注册过
    if (await isRegister(phone)) {
    
      // 此处为数据库操作(可忽略)
        client.request('SendSms', params, requestOption).then((result) => {
    
    
            if (result.Code == 'OK') {
    
    
                res.send({
    
    
                    status: 200,
                    msg: '发送成功'
                });
                loginInfo.push({
    
    
                    phone: phone,
                    code: randCode
                });
                console.log(randCode)
            } else {
    
    
                res.send({
    
    
                    status: 400,
                    msg: '发送失败'
                })
            }
        })
    } else {
    
    
        res.send({
    
    
            status: 400,
            msg: '该手机号未注册'
        })
    }
}

//# 验证码登录接口
let phoneCodeLogin = async(req, res) => {
    
    
    let {
    
     phone, code } = req.body;
    if (validate(phone)) {
    
     //判断手机号是否发送过验证码
        if (validateCode(phone, code)) {
    
     // 判断验证码与手机号是否匹配
            let user = await isFirstLogin(phone); // 此处为数据库操作,获取用户信息(可忽略)
            res.send({
    
    
                status: 200,
                msg: '登录成功',
                data: user[0]
            })
            loginInfo = []; // 登录成功,立马清空数组,以免无法再次发送验证码
        } else {
    
    
            res.send({
    
    
                status: 400,
                msg: '验证码错误'
            })
        }
    } else {
    
    
        res.send({
    
    
            status: 400,
            msg: '未获取验证码'
        })
    }
}

// 注意:最后记得把接口暴露出去

참고 : accessKeyId、accessKeySecret사용 전 신청 하셔야 합니다 .

여기에 사진 설명 삽입

3. 인터페이스를 사용하여 로그인

Postman 인터페이스 디버깅 도구를 예로 들어 보면 휴대폰 번호는 데이터베이스에 등록 된 휴대폰 번호입니다.

  1. 인증 코드 전송 요청

여기에 사진 설명 삽입

  1. 휴대폰에 인증 코드 수신

여기에 사진 설명 삽입

  1. 인증 코드 로그인

여기에 사진 설명 삽입

Ollie, 길의 모든 사람

추천

출처blog.csdn.net/cwq521o/article/details/107672402