📜  如何使用 Node.js 创建和验证 JWT?

📅  最后修改于: 2022-05-13 01:56:23.589000             🧑  作者: Mango

如何使用 Node.js 创建和验证 JWT?

在本文中,我们将了解如何在 Node.js 中创建和验证 JWT 令牌。

先决条件:

  • 良好的 JavaScript 知识。
  • 关于 ExpressJs 的基础知识。
  • API认证基础知识。
  • 关于邮递员及其用途的基本知识。

在 Web 开发中,我们还希望保护我们的路由,因此我们有 3 种类型的方法来保护我们的路由,它们是 cookie、会话或 API 身份验证。如果您希望 API 端点中的安全路由,cookie 和会话仅适用于浏览器。所以你必须需要API的认证机制。或者在目前,我们主要使用 API,因此必须创建安全的 API 端点。 API 身份验证中最流行的方式是使用 JsonWebToken,它与多种技术以及 NodeJ 一起工作。在本文中,我们在 ExpressJs 的帮助下创建了一些虚拟 API 端点,并在 JWT 令牌机制的帮助下确保它们的路由安全,并了解它们如何工作和验证令牌。 JsonWebtoken 的缩写是 JWT。

方法:在开始本文之前,我们将在这里讨论文章的问题细节,我们正在讨论保护 API 端点的最流行的方法。智威汤逊提供的。我们将首先设置 NodeJs 来编写我们的代码,然后我们将看到如何创建和验证 JWT 令牌,最后,我们将在 Postman API 测试工具的帮助下看到我们的 API 输出。

分步实施:

第一步:首先建立NodeJs项目。如果你没有NodeJs或NPM请参考这篇文章。使用 npm 启动 NodeJs 项目。

npm init -y

“-y”将所有问题答案标记为默认值。

启动 NodeJs 项目后,进入第二步。

步骤2:启动项目后安装一些依赖项。通过 npm 安装 express 和 jsonwebtoken

npm install express jsonwebtoken

第 3 步:将 nodemon 安装为开发依赖项。

npm install -d nodemon

项目结构:安装完成后,创建一个 index.js 文件,现在你的目录结构如下所示。

第 4 步:在 package.json 文件中再添加一个脚本。打开 package.json 文件并将下面的一行添加到测试脚本中。

步骤 5:在借助 JWT 创建和验证 API 端点之前,首先编写一些代码以供进一步使用。

文件名:index.js

Javascript
// Import express for creating API's endpoints
const express = require('express');
 
// Import jwt for API's endpoints authentication
const jwt = require('jsonwebtoken');
 
// Creates an Express application, initiate
// express top level function
const app = express();
 
// A port for serving API's
const port = 3000;
 
 
// A demo get route
app.get('/', (req, res) => {
    res.json({
        route: '/',
        authentication: false
    });
});
 
 
// Listen the server
app.listen(port, () => {
    console.log(`Server is running : http://localhost:${port}/`);
});


Javascript
// A fake database object.
let databse = [
    {
        name: 'gfg',
        work: 'knowledge provider',
        password: 'abc'
    },
    {
        name: 'suryapratap',
        work: 'technical content writer',
        password: '123'
    }
];


Javascript
// Allow json data
app.use(express.json());


Javascript
// Login route.
app.post('/login', (req, res) => {
 
    // Get the name to the json body data
    const name = req.body.name;
 
    // Get the password to the json body data
    const password = req.body.password;
 
    // Make two variable for further use
    let isPresent = false;
    let isPresnetIndex = null;
 
    // Iterate a loop to the data items and
    // check what data are method
    for(let i=0; i


Javascript
jwt.sign(
    {data_obeject},
    "secret_key",
    {Options}
)


Javascript
// Verify route
app.get('/auth', (req, res) => {
 
    // Get token value to the json body
    const token = req.body.token;
 
    // If the token is present
    if(token){
 
        // Verify the token using jwt.verify method
        const decode = jwt.verify(token, 'secret');
 
        //  Return response with decode data
        res.json({
            login: true,
            data: decode
        });
    }else{
 
        // Return response with error
        res.json({
            login: false,
            data: 'error'
        });
    }
});


Javascript
jwt.verify(token_value, 'secret_key');


Javascript
// Import express for creating API's endpoints
const express = require("express");
 
// Import jwt for API's endpoints authentication
const jwt = require("jsonwebtoken");
 
// Creates an Express application, initiate
// express top level function
const app = express();
 
// A port for serving API's
const port = 3000;
 
// A fake database object
let databse = [
  {
    name: "gfg",
    work: "knowledge provider",
    password: "abc",
  },
  {
    name: "suryapratap",
    work: "technical content writer",
    password: "123",
  },
];
 
// A demo get route
app.get("/", (req, res) => {
  res.json({
    route: "/",
    authentication: false,
  });
});
 
// Allow json data
app.use(express.json());
 
// Login route
app.post("/login", (req, res) => {
 
  // Get the name to the json body data
  const name = req.body.name;
 
  // Get the password to the json body data
  const password = req.body.password;
 
  // Make two variable for further use
  let isPresent = false;
  let isPresnetIndex = null;
 
  // iterate a loop to the data items and
  // check what data are matched.
  for (let i = 0; i < databse.length; i++) {
 
    // If data name are matched so check
    // the password are correct or not
    if (databse[i].name === name
      && databse[i].password === password) {
 
      // If both are correct so make
      // isPresent variable true
      isPresent = true;
 
      // And store the data index
      isPresnetIndex = i;
 
      // Break the loop after matching successfully
      break;
    }
  }
 
  // If isPresent is true, then create a
  // token and pass to the response
  if (isPresent) {
 
    // The jwt.sign method are used
    // to create token
    const token = jwt.sign(databse[isPresnetIndex], "secret");
 
    // Pass the data or token in response
    res.json({
      login: true,
      token: token,
      data: databse[isPresnetIndex],
    });
  } else {
 
    // If isPresent is false return the error
    res.json({
      login: false,
      error: "please check name and password.",
    });
  }
});
 
// Verify route
app.get("/auth", (req, res) => {
 
  // Get token value to the json body
  const token = req.body.token;
 
  // If the token is present
  if (token) {
 
    // Verify the token using jwt.verify method
    const decode = jwt.verify(token, "secret");
 
    //  Return response with decode data
    res.json({
      login: true,
      data: decode,
    });
  } else {
 
    // Return response with error
    res.json({
      login: false,
      data: "error",
    });
  }
});
 
// Listen the server
app.listen(port, () => {
  console.log(`Server is running :
    http://localhost:${port}/`);
});



Step 6: dummy code准备好后,创建一个json数据库对象并存储一些dummy数据。

文件名:index.js

Javascript

// A fake database object.
let databse = [
    {
        name: 'gfg',
        work: 'knowledge provider',
        password: 'abc'
    },
    {
        name: 'suryapratap',
        work: 'technical content writer',
        password: '123'
    }
];


第 7 步:允许 JSON 数据与 API 进行通信。通过为正文解析器添加中间件来允许请求中的 JSON 数据。

文件名:index.js

Javascript

// Allow json data
app.use(express.json());


第 8 步:创建登录路由并创建 JWT 令牌。在这里,创建一个登录帖子路由并创建一个 JWT 令牌并将其返回到响应中。阅读代码注释以更好地理解。

文件名:index.js

Javascript

// Login route.
app.post('/login', (req, res) => {
 
    // Get the name to the json body data
    const name = req.body.name;
 
    // Get the password to the json body data
    const password = req.body.password;
 
    // Make two variable for further use
    let isPresent = false;
    let isPresnetIndex = null;
 
    // Iterate a loop to the data items and
    // check what data are method
    for(let i=0; i


步骤 9: JWT 签名方法用于创建令牌,其中包含三个参数,一个是响应对象,第二个是密钥,最后一个是选项对象,以便更好地使用令牌。

文件名:index.js

Javascript

jwt.sign(
    {data_obeject},
    "secret_key",
    {Options}
)


如果您想了解有关 jwt.sign 方法的更多信息,请参阅官方文档。

第 10 步:现在我们将为认证 jwt 令牌创建另一条路由。在这里,我们创建一个身份验证路由并验证即将到来的 JWT 令牌。

文件名:index.js

Javascript

// Verify route
app.get('/auth', (req, res) => {
 
    // Get token value to the json body
    const token = req.body.token;
 
    // If the token is present
    if(token){
 
        // Verify the token using jwt.verify method
        const decode = jwt.verify(token, 'secret');
 
        //  Return response with decode data
        res.json({
            login: true,
            data: decode
        });
    }else{
 
        // Return response with error
        res.json({
            login: false,
            data: 'error'
        });
    }
});


步骤 11: JWT 验证方法用于验证令牌,有两个参数,一个是令牌字符串值,第二个是密钥,用于匹配令牌是否有效。验证方法返回我们存储令牌的解码对象。

文件名:index.js

Javascript

jwt.verify(token_value, 'secret_key');


如果您想了解有关 jwt.verify 方法的更多信息,请参阅官方文档。

下面是上述分步实现的完整代码:

文件名:index.js

Javascript

// Import express for creating API's endpoints
const express = require("express");
 
// Import jwt for API's endpoints authentication
const jwt = require("jsonwebtoken");
 
// Creates an Express application, initiate
// express top level function
const app = express();
 
// A port for serving API's
const port = 3000;
 
// A fake database object
let databse = [
  {
    name: "gfg",
    work: "knowledge provider",
    password: "abc",
  },
  {
    name: "suryapratap",
    work: "technical content writer",
    password: "123",
  },
];
 
// A demo get route
app.get("/", (req, res) => {
  res.json({
    route: "/",
    authentication: false,
  });
});
 
// Allow json data
app.use(express.json());
 
// Login route
app.post("/login", (req, res) => {
 
  // Get the name to the json body data
  const name = req.body.name;
 
  // Get the password to the json body data
  const password = req.body.password;
 
  // Make two variable for further use
  let isPresent = false;
  let isPresnetIndex = null;
 
  // iterate a loop to the data items and
  // check what data are matched.
  for (let i = 0; i < databse.length; i++) {
 
    // If data name are matched so check
    // the password are correct or not
    if (databse[i].name === name
      && databse[i].password === password) {
 
      // If both are correct so make
      // isPresent variable true
      isPresent = true;
 
      // And store the data index
      isPresnetIndex = i;
 
      // Break the loop after matching successfully
      break;
    }
  }
 
  // If isPresent is true, then create a
  // token and pass to the response
  if (isPresent) {
 
    // The jwt.sign method are used
    // to create token
    const token = jwt.sign(databse[isPresnetIndex], "secret");
 
    // Pass the data or token in response
    res.json({
      login: true,
      token: token,
      data: databse[isPresnetIndex],
    });
  } else {
 
    // If isPresent is false return the error
    res.json({
      login: false,
      error: "please check name and password.",
    });
  }
});
 
// Verify route
app.get("/auth", (req, res) => {
 
  // Get token value to the json body
  const token = req.body.token;
 
  // If the token is present
  if (token) {
 
    // Verify the token using jwt.verify method
    const decode = jwt.verify(token, "secret");
 
    //  Return response with decode data
    res.json({
      login: true,
      data: decode,
    });
  } else {
 
    // Return response with error
    res.json({
      login: false,
      data: "error",
    });
  }
});
 
// Listen the server
app.listen(port, () => {
  console.log(`Server is running :
    http://localhost:${port}/`);
});

测试路由的步骤:我们将使用 Postman 测试 API 路由。首先测试登录路径。打开邮递员并使用适当的 JSON 数据在'/login'路由上发出 post 请求。

使用 localhost 地址并在 /login 路由中发出 post 请求,并以 json 格式发送适当的数据,最后,您将获得包含登录状态和对象的令牌或数据的 JSON 响应。使用令牌对 API 端点进行身份验证,然后再次使用 localhost 地址并在“/auth”路由中发出获取请求并发送适当的数据令牌。

验证后,您将在令牌中获得正确的数据对象存储。