Node.js中JWT实现身份验证的详细步骤
作者:关山月
在开始之前,我假设你已经在你的机器上安装了Node.js、MongoDB和VS Code,并且你知道如何创建MongoDB数据库和基本的RESTful API。
让我们开始吧!
什么是JWT认证?
JWT身份验证依赖JSON Web令牌来确认Web应用中用户的身份。JSON Web令牌是使用密钥进行数字签名。
简而言之,JWT身份为网站提供一个密码。一旦你登录,你就得到了这个密码。
JSON Web Token由三个部分组成,由点.
分开:
- Header
- Payload
- Signature
下面是JWT的基本结构:
xxxx.yyyy.zzzz
- Header: 这部分包含有关令牌的信息,如其类型和如何保护。
- Payload: 这部分包含关于用户的声明,如用户名或角色。
- Signature: 确保令牌的完整性,并验证它没有被更改,这可以确保代码安全。
现在,让我们看看在node.js项目中进行JWT身份验证的步骤。
步骤1:设置项目
首先,创建一个新目录:
mkdir nodejs-jwt-auth cd nodejs-jwt-auth
在终端中运行以下命令初始化项目:
npm init -y
接下来,通过以下命令安装必要的依赖项:
npm install express mongoose jsonwebtoken dotenv
上面的命令将安装:
- express:用于构建Web服务器。
- mongoose:MongoDB的ODM(对象数据建模)库。
- jsonwebtoken:生成和验证JSON Web令牌(JWT)以进行身份验证。
- dotenv:从
.env
文件加载环境变量。
此时,您的package.json
文件应该如下所示:
步骤2:获取MongoDB连接字符串
要获取MongoDB连接字符串,请查看以下链接。
9 Steps to Build a RESTful API with Node.js, MongoDB, and Express
步骤3:创建.env文件
为了保护MongoDB连接信息,让我们在根目录中创建一个名为.env
的新文件。
将以下代码添加到.env
文件中。
MONGODB_URL=<Your MongoDB Connection String> SECRET_KEY="your_secret_key_here"
将 <Your MongoDB Connection String>
替换为您从MongoDB Atlas获得的连接字符串。
MONGODB_URL='mongodb+srv://shefali:********@cluster0.sscvg.mongodb.net/nodejs-jwt-auth' SECRET_KEY="ThisIsMySecretKey"
最后,在MONGODB_URL中,我添加了nodejs-jwt-auth
,这是我们的数据库名称。
步骤4:设置Express应用程序
在根目录下创建一个名为index.js的
文件,并将以下代码添加到该文件中。
const express = require("express"); const mongoose = require("mongoose"); require("dotenv").config(); //for using variables from .env file. const app = express(); const port = 3000; //middleware provided by Express to parse incoming JSON requests. app.use(express.json()); mongoose.connect(process.env.MONGODB_URL).then(() => { console.log("MongoDB is connected!"); }); app.get("/", (req, res) => { res.send("Hello World!"); }); app.listen(port, () => { console.log(`Server is listening on port ${port}`); });
现在,让我们通过以下命令运行服务器。
node index.js
输出如下图所示:
通过使用命令node index.js
,必须在每次更改文件时重新启动服务器。为了避免这种情况,您可以使用以下命令安装nodemon
。
npm install -g nodemon
现在使用下面的命令运行服务器,它会在每次更改文件时重新启动服务器。
nodemon index.js
步骤5:创建用户模型
在根目录下创建一个名为“models”的新目录,并在其中创建一个名为“User.js”的新文件。
将以下代码添加到User.js
文件中:
const mongoose = require("mongoose"); const userSchema = new mongoose.Schema({ username: { type: String, required: true, unique: true, }, password: { type: String, required: true, }, }); module.exports = mongoose.model("User", userSchema);
步骤6:实现身份验证路由
在根目录中,创建一个名为“routes”的新目录,并在其中创建一个名为“auth.js”的文件。
现在,将以下代码添加到该文件中:
const express = require("express"); const jwt = require("jsonwebtoken"); const User = require("../models/User"); const router = express.Router(); // Signup route router.post("/signup", async (req, res) => { try { const { username, password } = req.body; const user = new User({ username, password }); await user.save(); res.status(201).json({ message: "New user registered successfully" }); } catch (error) { res.status(500).json({ message: "Internal server error" }); } }); // Login route router.post("/login", async (req, res) => { const { username, password } = req.body; try { const user = await User.findOne({ username }); if (!user) { return res.status(401).json({ message: "Invalid username or password" }); } if (user.password !== password) { return res.status(401).json({ message: 'Invalid username or password' }); } // Generate JWT token const token = jwt.sign( { id: user._id, username: user.username }, process.env.SECRET_KEY ); res.json({ token }); } catch (error) { res.status(500).json({ message: "Internal server error" }); } }); module.exports = router;
步骤7:使用中间件保护路由
在根目录中,创建一个名为middleware.js的
新文件,并将以下代码添加到该文件中。
const jwt = require("jsonwebtoken"); function verifyJWT(req, res, next) { const token = req.headers["authorization"]; if (!token) { return res.status(401).json({ message: "Access denied" }); } jwt.verify(token, process.env.SECRET_KEY, (err, data) => { if (err) { return res.status(401).json({ message: "Failed to authenticate token" }); } req.user = data; next(); }); } module.exports = verifyJWT;
代码是一个中间件函数,用于在应用程序中验证JSON Web令牌(JWT)。
步骤8:解码细节
现在要解码详细信息,请修改index.js
,如下所示:
const express = require('express'); const authRouter = require('./routes/auth'); const mongoose = require("mongoose"); const verifyJWT = require("./middleware") require("dotenv").config(); //for using variables from .env file. const app = express(); const PORT = 3000; mongoose.connect(process.env.MONGODB_URL).then(() => { console.log("MongoDB is connected!"); }); app.use(express.json()); //Authentication route app.use('/auth', authRouter); //decodeDetails Route app.get('/decodeDetails', verifyJWT, (req, res) => { const { username } = req.user; res.json({ username }); }); app.listen(PORT, () => { console.log(`Server is running on port ${PORT}`); });
/auth
路由由authRouter处理,用于用户身份验证。
app.get('/decodeDetails', verifyJWT, (req, res) => { const { username } = req.user; res.json({ username }); });
当向/decodeDetails
发出请求时,verifyJWT中间件验证JWT令牌。
步骤9:测试API
为了测试API,使用了名为Thunder Client的VS Code扩展。
注册
向 http://localhost:3000/auth/signup
发送一个POST请求,其中包含Headers Content-Type : application/json
和以下JSON主体:
{ "username": "shefali", "password": "12345678" }
在响应中,您将看到消息“新用户注册成功”。
登录
向 http://localhost:3000/auth/login
发送一个POST请求,其中包含Header Content-Type : application/json
和JSON主体,以及您在注册路由中创建的用户名和密码。
{ "username": "shefali", "password": "12345678" }
在响应中,您将收到一个令牌。记下这个令牌,因为在测试decodeDetails路由时需要它。
decodeDetails
向 http://localhost:3000/decodeDetails
发送一个GET请求,并带有令牌值的Authorization头。
在响应中,您将获得用户名。
您已经在Node.js应用程序中成功实现了JWT身份验证。这种方法提供了一种安全有效的方式,来验证Web应用程序中的用户。
以上就是Node.js中JWT实现身份验证的详细步骤的详细内容,更多关于Node.js JWT身份验证的资料请关注脚本之家其它相关文章!