网易首页 > 网易号 > 正文 申请入驻

使用 Express 和 Node.js 进行电话身份验证

0
分享至

一个简单的网络教程,使用 node 快速制作电话验证 API。

使用没有 Firebase 或 AWS Amplify 的电话号码和 OTP 登录用户。

每日分享最新,最流行的软件开发知识与最新行业趋势,希望大家能够一键三连,多多支持,跪求关注,点赞,留言。


我在此示例中使用 Twilio,您可以使用任何 SMS 提供商。
需要的依赖
特维利奥
调用 API 发送 OTP。
加密货币
创建sha265用于客户端识别的哈希。
jsonwebtoken
JTW Token当用户通过身份验证时发送。
身体解析器
解析请求正文
安装依赖项
npm install Twilio crypto jsonwebtoken bodyParser
入门
导入语句
let app = require('express')();
let crypto = require('crypto');
let jwt = require('jsonwebtoken');
let bodyParser = require('body-parser');
用于演示目的的假数据库,请确保稍后将其连接到真实数据库
var users = [
{
id: 1,
name: 'John Doe',
number: '+1234567890',
},
{
id: 2,
name: 'Bob Williams',
number: '1234567891',
},
];
express正文解析默认捆绑在v-4.16.0. 自 2020 年以来express已删除默认正文解析。我们现在必须手动完成。
let jsonParser = bodyParser.json();
生成密钥
生成一个JWT KeyandHash key来验证客户端发送的令牌没有被篡改。
有很多方法可以生成唯一密钥。我正在使用node生成唯一键。
node
require('crypto').randomBytes(64).toStrong('hex')
该命令将生成一个随机字符串。将其复制并粘贴到 .env 中。
再次为第二个密钥运行此命令并将其粘贴到 .env 中。
HASH_KEY=
JWT_KEY=
设置 Twilio
为了这个示例,我们将使用 Twilio,但概念和代码示例对于所有框架仍然适用。
登录到您的 Twilio 控制台。
屏幕截图 2022-09-22 下午 5.13.24.png
从仪表板复制Account SID、Auth Token和。 粘贴进去My Twilio phone number
.env
TWILIO_ACCOUNT_SID=
TWILIO_AUTH_TOKEN=
TWILIO_NUMBER=
声明 .env 变量
在文件顶部声明 .env 变量以从 .env 变量中获取密钥
require('dotenv').config();
let hashKey = process.env.HASH_KEY;
let jwtKey = process.env.JWT_KEY;
var accountSid = process.env.TWILIO_ACCOUNT_SID;
var authToken = process.env.TWILIO_AUTH_TOKEN;
let twilioNumber = process.env.TWILIO_NUMBER;
声明Twilio客户端并声明你的Account SID,Auth Token和My Twilio phone number.
var client = require('twilio')(, );
现在我们已准备好构建端点。
我们必须建立两个端点
请求一次性密码
验证一次性密码
1. 请求 OTP
从请求正文中获取用户号
let number = req.body.number;
OTP 生成逻辑它将返回 3 位 OTP ,
如果要增加长度增加 a 0。1000
let otp = Math.floor(1000 + Math.random() * 9000);
创建一个秘密哈希来验证客户端2. Verify OTP
let ttl = 5 * 60 * 1000;
let expires = Date.now() + ttl;
let data = `${number}.${otp}.${expires}`;
let hash = crypto.createHmac('sha256', hashKey).update(data).digest('hex');
let secretHash = `${hash}.${expires}`;
检查用户号是否已经注册
var user = users.find((user) => user.number === number);
用户不存在时处理
if (!user) {
users.push({
id: users.length + 1,
name: '',
number: number,
});
}
现在有趣的部分。secretHash通过Twilio 和response.
Twilio 可能会出现一些错误,因此将其包装在try catch. client从 Twilio调用该方法并通过 SMS 发送 OTP。
该body属性接受您要发送给客户端的消息。
from属性获取您的 Twilio 电话号码。
to属性接受客户的号码。
如果消息发送成功,发送secretHastthrough response。如果Twilio通过error发送"Error sending OTP"为response
try {
client.messages
.create({
body: `Dear customer,\n Your OTP is ${otp}. PLEASE DO NOT SHARE THIS OTP WITH ANYONE.`,
from: twilioNumber,
to: number,
})
.then(() => {
//Send the secret hash to the client
res.json(secretHash);
})
.catch((err) => {
//Handle the twilio error
res.status(500).send('Error sending OTP');
});
} catch (err) {
//Handle the error
console.log(err);
}
2.验证OTP
从请求者正文中获取number, OTP,secretHash
let { number, otp, secretHash } = req.body;
从发送给客户端的 secretHash 中分割散列和到期时间1. Request OTP
let [hashValue, expires] = secretHash.split('.');
检查是否已过期并处理此案。
let now = Date.now();
if (now > parseInt(expires))
return res.json({ error: 'Timeout. Please try again' });
使用用户号、OTP 和到期时间创建新哈希
let data = `${number}.${otp}.${expires}`;
let newCalculatedHash = crypto
.createHmac('sha256', hashKey)
.update(data)
.digest('hex');
将新哈希与客户端发送的哈希进行比较。如果它们匹配,则JWT使用数据库中的用户信息生成一个并添加一个有效期。
if (newCalculatedHash === hashValue) {
var user = users.find((user) => user.number === number);
let payload = {
number: number,
name: user.name,
id: user._id,
};
//Create a JWT token
let token = jwt.sign(payload, jwtKey, { expiresIn: '1y' });
//Send the token to the client
return res.json(token);
} else {
//Handle the case when the hash does not match
return res.json({ error: 'Invalid OTP. Please try again' });
}
完成后,我们就可以预览项目了。运行以下命令以运行本地开发服务器。
node index.js

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
闹笑话了!黄仁勋摊牌:看不上华为韬定律,却被业内专家说不专业

闹笑话了!黄仁勋摊牌:看不上华为韬定律,却被业内专家说不专业

兵鉴史
2026-05-30 14:32:11
台积电领先10年?黄仁勋误读了韬定律

台积电领先10年?黄仁勋误读了韬定律

观察者网
2026-05-29 12:17:11
国家,为什么一定要死磕塔克拉玛干?不止治沙那么简单

国家,为什么一定要死磕塔克拉玛干?不止治沙那么简单

清沐执笔
2026-05-30 18:50:44
巴黎王朝,一冠之遥

巴黎王朝,一冠之遥

足球报
2026-05-31 13:40:41
中美日一季度GDP差距断崖,美国7.32万亿,日本1.02万亿

中美日一季度GDP差距断崖,美国7.32万亿,日本1.02万亿

又是美好的日子
2026-05-27 22:56:03
3500万!恭喜里夫斯!引进詹姆斯+字母哥,骑士发力了...

3500万!恭喜里夫斯!引进詹姆斯+字母哥,骑士发力了...

詹姆斯吧
2026-05-30 14:38:51
“白嫖”也算盗窃!河北赞皇一40岁男与女子发生不正当交易被判刑

“白嫖”也算盗窃!河北赞皇一40岁男与女子发生不正当交易被判刑

火山詩话
2026-05-30 14:18:06
异常热浪在法国造成7人死亡,中国留学生:当地普遍不装空调,这几天很崩溃,连续一周没怎么睡好觉

异常热浪在法国造成7人死亡,中国留学生:当地普遍不装空调,这几天很崩溃,连续一周没怎么睡好觉

极目新闻
2026-05-31 12:55:56
90 后中国小伙竞选日本市长!主张关闭靖国神社,日本人彻底破防

90 后中国小伙竞选日本市长!主张关闭靖国神社,日本人彻底破防

混沌录
2026-05-30 10:33:08
相较于服刑时长,年龄问题更受外界热议

相较于服刑时长,年龄问题更受外界热议

人间烟火记事本
2026-05-31 07:45:53
古代犯人发配需要衙役押送,往返几千里路,衙役是不是也很遭罪?

古代犯人发配需要衙役押送,往返几千里路,衙役是不是也很遭罪?

小豫讲故事
2026-05-29 06:00:15
我不是中国人!马来西亚博主疯狂吐槽,别自作多情了,我只是华人

我不是中国人!马来西亚博主疯狂吐槽,别自作多情了,我只是华人

小鋭有话说
2026-05-30 23:12:00
联盟第一人宝座没了?SGA抢七空砍35分,蝉联MVP,却蝉联不了FMVP

联盟第一人宝座没了?SGA抢七空砍35分,蝉联MVP,却蝉联不了FMVP

无术不学
2026-05-31 11:49:11
35页PPT疯传:洛阳女子1女谈3男,每天卡时间,都已谈婚论嫁

35页PPT疯传:洛阳女子1女谈3男,每天卡时间,都已谈婚论嫁

烈史
2026-05-30 13:23:41
“太帅啦” 樊振东戴上发带引全场女球迷欢呼!0-6后火速回击质疑

“太帅啦” 樊振东戴上发带引全场女球迷欢呼!0-6后火速回击质疑

风过乡
2026-05-31 08:20:47
中国当头棒喝日本!更狠的重拳,已在路上。

中国当头棒喝日本!更狠的重拳,已在路上。

苗苗情感说
2026-05-31 12:20:52
今晚CBA总决赛三番战上海!赛前传来1坏消息,王博没机会了

今晚CBA总决赛三番战上海!赛前传来1坏消息,王博没机会了

生活新鲜市
2026-05-31 12:17:20
黄仁勋被粉丝偶遇追着抢买单 当场拒绝:我比较有钱 不用请我

黄仁勋被粉丝偶遇追着抢买单 当场拒绝:我比较有钱 不用请我

快科技
2026-05-29 12:29:06
30年申冤狱中暴毙,头颅铁钉牵出中央督办大案,黄庆忠冤案始末!

30年申冤狱中暴毙,头颅铁钉牵出中央督办大案,黄庆忠冤案始末!

易玄
2026-05-31 11:45:11
法网女单彻底乱了:随着卫冕冠军爆大冷1-2,世界前十已有5将出局

法网女单彻底乱了:随着卫冕冠军爆大冷1-2,世界前十已有5将出局

侧身凌空斩
2026-05-31 02:25:54
2026-05-31 14:24:49
牛马科技
牛马科技
业务数码玩家.无聊的博主
6030文章数 615关注度
往期回顾 全部

科技要闻

戴尔诺基亚又回来了!AI重估老牌科技公司

头条要闻

法国已有7人因异常热浪死亡 中国留学生:这几天很崩溃

头条要闻

法国已有7人因异常热浪死亡 中国留学生:这几天很崩溃

体育要闻

阿森纳用最悲壮的方式,成就了巴黎王朝

娱乐要闻

贾玲最新动作!侯明昊给虞书欣抬轿!

财经要闻

医学首席转岗搞科技,A股科技股遭遇巨震

汽车要闻

900V+3.2秒破百 领克10+&领克10上市16.99万元起

态度原创

房产
游戏
教育
手机
军事航空

房产要闻

红动五月!全国抢入核心资产,广州盯紧凯旋新世界!

91岁杨老头弃坑《生化危机7》!直言:不吓自己只想快乐

教育要闻

瀚海扬帆启志 朝阳煦润童心 | 济南高新区瀚阳学校举办六一文艺汇演

手机要闻

微软宣布下周携手英伟达开启PC新时代;苹果iPhone 18机模曝光

军事要闻

美防长参加"香会" 就美中关系最新表态

无障碍浏览 进入关怀版