Node.js中JWT实现身份验证的详细步骤

 更新时间:2024年12月26日 09:55:46   作者:关山月  
身份验证是Web开发的重要组成部分,JWT由于其简单性,安全性和可扩展性,已成为在Web应用程序中实现身份验证的流行方法,在这篇文章中,我将指导你在Node.js应用程序中使用MongoDB进行数据存储来实现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身份验证的资料请关注脚本之家其它相关文章!

相关文章

  • npm错误errno -4048解决办法

    npm错误errno -4048解决办法

    这篇文章主要给大家介绍了关于npm错误errno -4048解决的相关资料,这个错误代码通常表示文件系统错误或者硬件故障引起的问题,文中通过图文将解决的办法介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • mac中利用NVM管理不同node版本的方法详解

    mac中利用NVM管理不同node版本的方法详解

    这篇文章主要给大家介绍了关于在mac中利用NVM管理不同node版本的相关资料,文中详细介绍了nvm的安装和卸载、nvm安装node的方法,以及nvm如何管理node版本,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。
    2017-11-11
  • 利用express启动一个server服务的方法

    利用express启动一个server服务的方法

    下面小编就为大家带来一篇利用express启动一个server服务的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环

    我的Node.js学习之路(三)--node.js作用、回调、同步和异步代码 以及事件循环

    本篇文章主要介绍了node.js的几个重要的知识点:node.js作用、回调、同步和异步代码 以及事件循环
    2014-07-07
  • Node.js 多线程实战小结

    Node.js 多线程实战小结

    在 Node.js 的世界中,多线程技术一直是一个受到广泛关注的领域,本文主要介绍了Node.js 多线程实战小结,具有一定的参考价值,感兴趣的可以了解一下
    2024-01-01
  • Node.js爬虫如何获取天气和每日问候详解

    Node.js爬虫如何获取天气和每日问候详解

    这篇文章主要给大家介绍了关于Node.js爬虫如何获取天气和每日问候的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Node.js爬虫具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • NodeJS使用Range请求实现下载功能的方法示例

    NodeJS使用Range请求实现下载功能的方法示例

    本篇使用 NodeJS 的 HTTP 服务创建客户端,使用 Range 请求实现下载功能,本篇使用 NodeJS 的 HTTP 服务创建客户端,使用 Range 请求实现下载功能
    2018-10-10
  • yarn的使用与升级Node.js的方法详解

    yarn的使用与升级Node.js的方法详解

    这篇文章主要给大家介绍了关于yarn的使用与利用yarn升级Node.js的方法,文中介绍的非常详细,对大家具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-06-06
  • nvm管理node无法正常切换node版本问题的解决方法

    nvm管理node无法正常切换node版本问题的解决方法

    相信一定会有存在一些小伙伴 明明都已经按着操作卸载node 和安装nvm 了但是 依旧无法正常通过nvm管理node,本文将给大家介绍nvm管理node无法正常切换node版本问题的解决方法,需要的朋友可以参考下
    2024-01-01
  • Node.js进程管理之子进程详解

    Node.js进程管理之子进程详解

    本文详细讲解了Node.js进程管理之子进程,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07

最新评论