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

使用 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-02-23 21:55:58
2026年大裁员预警:这6个行业首当其冲

2026年大裁员预警:这6个行业首当其冲

牛锅巴小钒
2026-02-23 19:15:44
郑丽文最大的敌人浮出水面!意外带火了马英九洪秀柱的书法作品!

郑丽文最大的敌人浮出水面!意外带火了马英九洪秀柱的书法作品!

晓帝爱八卦
2026-02-23 15:32:45
妈祖被换后续:官方发通报澄清,许家人身份曝光,还有更多疑点

妈祖被换后续:官方发通报澄清,许家人身份曝光,还有更多疑点

离离言几许
2026-02-22 23:41:21
赵心童夺2026斯诺克球员锦标赛冠军

赵心童夺2026斯诺克球员锦标赛冠军

环球网资讯
2026-02-23 07:16:15
高市早苗当选日本第105任首相,外交部回应

高市早苗当选日本第105任首相,外交部回应

极目新闻
2026-02-23 21:57:05
为秦昊拼三胎!58岁伊能静怀三胎,已怀孕5个月是男宝,计划赴美生产

为秦昊拼三胎!58岁伊能静怀三胎,已怀孕5个月是男宝,计划赴美生产

八卦王者
2026-02-22 13:23:33
罪有应得!官方彻查后,闫学晶再迎噩耗,她最担心的事还是发生了

罪有应得!官方彻查后,闫学晶再迎噩耗,她最担心的事还是发生了

来科点谱
2026-01-23 11:08:02
“西蒙尼已与国际米兰达成下赛季预协议”

“西蒙尼已与国际米兰达成下赛季预协议”

绿茵情报局
2026-02-23 19:22:31
网传妈祖巡游活动“资本介入换童”?官方通报

网传妈祖巡游活动“资本介入换童”?官方通报

界面新闻
2026-02-22 21:07:11
太狠了!新股上市9天跌8天,70跌到43,散户:这是来卖公司的吧!

太狠了!新股上市9天跌8天,70跌到43,散户:这是来卖公司的吧!

财经市界
2026-02-23 20:00:45
还不满足!曝上海男篮继续引进外援,为夺冠不惜一切代价

还不满足!曝上海男篮继续引进外援,为夺冠不惜一切代价

篮球大陆
2026-02-23 19:48:12
利物浦弃将拯救热刺?40 万周薪巨星愿重返英超 只提一个条件

利物浦弃将拯救热刺?40 万周薪巨星愿重返英超 只提一个条件

澜归序
2026-02-24 01:28:18
8.5亿成本,《镖人》北美票房扑街,发行犯了《哪吒2》一样的错误

8.5亿成本,《镖人》北美票房扑街,发行犯了《哪吒2》一样的错误

电影票房预告片
2026-02-23 23:40:22
亚朵酒店的枕头,是怎么火起来的?

亚朵酒店的枕头,是怎么火起来的?

凤凰网财经
2026-02-21 19:08:05
为了“掏空”老百姓家底,而编造出来的“4大谎言”,谁信谁倒霉

为了“掏空”老百姓家底,而编造出来的“4大谎言”,谁信谁倒霉

平说财经
2026-02-18 08:38:03
新加坡连爆4大冷门!张本美和崩盘、孙颖莎压轴登场前夜暗流涌动

新加坡连爆4大冷门!张本美和崩盘、孙颖莎压轴登场前夜暗流涌动

生活新鲜市
2026-02-24 01:28:41
不良少女斉藤里恵:日本政坛的“全buff选手”

不良少女斉藤里恵:日本政坛的“全buff选手”

凑近看世界
2026-02-23 15:50:21
央视直播24日新加坡大满贯,王曼昱对郑怡静,王楚钦战户上隼辅

央视直播24日新加坡大满贯,王曼昱对郑怡静,王楚钦战户上隼辅

乒乓球球
2026-02-24 00:26:17
23岁女同事住院没人管,我请7天假陪护,出院后董事长却亲自来接

23岁女同事住院没人管,我请7天假陪护,出院后董事长却亲自来接

千秋文化
2026-02-21 19:44:13
2026-02-24 06:00:49
牛马科技
牛马科技
业务数码玩家.无聊的博主
5784文章数 611关注度
往期回顾 全部

科技要闻

智谱、MiniMax合计蒸发近千亿市值,为何?

头条要闻

墨西哥最大毒枭被击毙:喜欢杀人灭门 几乎没人看见过他

头条要闻

墨西哥最大毒枭被击毙:喜欢杀人灭门 几乎没人看见过他

体育要闻

哈登版骑士首败:雷霆的冠军课

娱乐要闻

那艺娜账号被禁止关注,视频已清空!

财经要闻

美国海关将停止征收被裁定违法的关税

汽车要闻

续航1810km!smart精灵#6 EHD超级电混2026年上市

态度原创

房产
手机
游戏
艺术
军事航空

房产要闻

窗前即地标!独占三亚湾C位 自贸港总裁行宫亮相

手机要闻

iPhone 18 Pro进入量产测试阶段 今年秋季发布

海盗PvE生存冒险《风启之旅》Steam愿望单破100万

艺术要闻

雍正帝御笔春条

军事要闻

美军重兵集结蓄力作战之际 新一轮美伊谈判时间“敲定”

无障碍浏览 进入关怀版