함유량
노드 서버 로그인 인터페이스는 실제 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 인터페이스 디버깅 도구를 예로 들어 보면 휴대폰 번호는 데이터베이스에 등록 된 휴대폰 번호입니다.
- 인증 코드 전송 요청
- 휴대폰에 인증 코드 수신
- 인증 코드 로그인