网站首页 > 开源技术 正文
一个简单的网络教程,使用 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
猜你喜欢
- 2024-10-22 调用 Express API时出现奇怪的CORS错误怎么办?
- 2024-10-22 详解如何从零开始搭建Express+Vue开发环境
- 2024-10-22 从零开始学习nodejs+express--交互环境
- 2024-10-22 express开发(一)简介与搭建(express创建项目)
- 2024-10-22 express中间件原理connect(express和koa中间件原理的区别)
- 2024-10-22 蓝易云 - centos系统直接部署express教程。
- 2024-10-22 Node + Express + Mysql: Todo List项目让你成全栈
- 2024-10-22 我为 Express 开了外挂(cad中的express怎么显示为中文)
- 2024-10-22 七爪源码:让我们 Dockerize 一个 Node.js Express 应用程序
- 2024-10-22 Node实战篇:Express--jade模板引擎(七)
你 发表评论:
欢迎- 03-19基于layui+springcloud的企业级微服务框架
- 03-19开箱即用的前端开发模板,扩展Layui原生UI样式,集成第三方组件
- 03-19SpringMVC +Spring +Mybatis + Layui通用后台管理系统OneManageV2.1
- 03-19SpringBoot+LayUI后台管理系统开发脚手架
- 03-19layui下拉菜单form.render局部刷新方法亲测有效
- 03-19Layui 遇到的坑(记录贴)(layui chm)
- 03-19基于ASP.NET MVC + Layui的通用后台开发框架
- 03-19LayUi自定义模块的定义与使用(layui自定义表格)
- 最近发表
-
- 基于layui+springcloud的企业级微服务框架
- 开箱即用的前端开发模板,扩展Layui原生UI样式,集成第三方组件
- SpringMVC +Spring +Mybatis + Layui通用后台管理系统OneManageV2.1
- SpringBoot+LayUI后台管理系统开发脚手架
- layui下拉菜单form.render局部刷新方法亲测有效
- Layui 遇到的坑(记录贴)(layui chm)
- 基于ASP.NET MVC + Layui的通用后台开发框架
- LayUi自定义模块的定义与使用(layui自定义表格)
- Layui 2.9.11正式发布(layui2.6)
- Layui 2.9.13正式发布(layui2.6)
- 标签列表
-
- jdk (81)
- putty (66)
- rufus (78)
- 内网穿透 (89)
- okhttp (70)
- powertoys (74)
- windowsterminal (81)
- netcat (65)
- ghostscript (65)
- veracrypt (65)
- asp.netcore (70)
- wrk (67)
- aspose.words (80)
- itk (80)
- ajaxfileupload.js (66)
- sqlhelper (67)
- express.js (67)
- phpmailer (67)
- xjar (70)
- redisclient (78)
- wakeonlan (66)
- tinygo (85)
- startbbs (72)
- webftp (82)
- vsvim (79)
本文暂时没有评论,来添加一个吧(●'◡'●)