编程开源技术交流,分享技术与知识

网站首页 > 开源技术 正文

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

wxchong 2024-10-22 17:54:06 开源技术 8 ℃ 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=<YOUR_HASH_KEY_HERE>
JWT_KEY=<YOUR_JWT_KEY_HERE>
设置 Twilio
为了这个示例,我们将使用 Twilio,但概念和代码示例对于所有框架仍然适用。

登录到您的 Twilio 控制台。

屏幕截图 2022-09-22 下午 5.13.24.png

从仪表板复制Account SID、Auth Token和。 粘贴进去My Twilio phone number
.env
TWILIO_ACCOUNT_SID=<YOUR_ACCOUNT_SID_HERE>
TWILIO_AUTH_TOKEN=<YOUR_AUTH_TOKEN_HERE>
TWILIO_NUMBER=<YOUR_PHONE_NUMBER_HERE>
声明 .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')(<Auccount SID>, <Auth Token>);
现在我们已准备好构建端点。
我们必须建立两个端点

请求一次性密码
验证一次性密码
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

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表