it编程 > 前端脚本 > Node.js

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

10人参与 2025-02-13 Node.js

在开始之前,我假设你已经在你的机器上安装了node.js、mongodb和vs code,并且你知道如何创建mongodb数据库和基本的restful api。

让我们开始吧!

什么是jwt认证?

jwt身份验证依赖json web令牌来确认web应用中用户的身份。json web令牌是使用密钥进行数字签名。

简而言之,jwt身份为网站提供一个密码。一旦你登录,你就得到了这个密码。

json web token由三个部分组成,由点.分开:

下面是jwt的基本结构:

xxxx.yyyy.zzzz 

现在,让我们看看在node.js项目中进行jwt身份验证的步骤。

步骤1:设置项目

首先,创建一个新目录:

mkdir nodejs-jwt-auth
cd nodejs-jwt-auth

在终端中运行以下命令初始化项目:

npm init -y

接下来,通过以下命令安装必要的依赖项:

npm install express mongoose jsonwebtoken dotenv

上面的命令将安装:

此时,您的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身份验证的资料请关注代码网其它相关文章!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

windows离线环境安装node-sass全过程

02-13

nvm如何查看node版本

02-13

详解如何在Node.js中正确处理async/await及数组迭代

02-13

详解Node.js中单线程限制的有效解决方法

02-13

NestJS中集成TypeORM进行数据库操作

02-13

nodejs中使用throw进行异常处理的操作方法

02-13

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论