Node登录权限验证token验证实现的方法示例

Node登录权限验证token验证是一种常用的用户认证方式。下面是实现这种验证的方法示例:

1. 生成Token

在编写代码之前,需要首先使用node.js的jsonwebtoken模块生成一个Token字符串。示例代码如下:

const jwt = require('jsonwebtoken');

// 生成Token的函数
function generateToken(user) {
  const payload = {
    sub: user.id,
    iat: Date.now()
  };
  const options = {
    expiresIn: '24h'
  };
  const secret = 'ThisIsASampleSecretKey';
  return jwt.sign(payload, secret, options);
}

在这个例子中,generateToken函数接收一个用户对象user,通过使用jsonwebtoken生成一个JWT Token字符串。这个函数使用了一个SecretKey,SecretKey是一个可以保证Token字符串安全的唯一密钥,因此需要在生成Token的时候设置一个SecretKey。

2. 校验Token

代码中有一个需要保证的功能是登录用户后的请求只有拥有有效Token的用户才可以访问。下面是一个示例,该示例代码用于校验Token的有效性:

const jwt = require('jsonwebtoken');

// 安全验证中间件函数,用于校验Token的有效性
function verifyToken(req, res, next) {
  const authHeader = req.headers.authorization;
  if (!authHeader) {
    return res.sendStatus(401);
  }

  const token = authHeader.split(' ')[1];

  jwt.verify(token, 'ThisIsASampleSecretKey', (err, user) => {
    if (err) {
      return res.sendStatus(403);
    }

    req.user = user;
    next();
  });
}

这个中间件函数用于校验Token的有效性,首先要从请求头中提取Token字符串。如果请求头中没有Authorization字段或者无效,则返回状态码401,表示访问被拒绝。如果Token字符串能够被提取,那么使用jsonwebtoken的verify函数进行Token验证。由于校验Token的函数是一个异步函数,所以使用了回调函数来处理验证结果,如果Token无效则返回状态码403。如果Token是有效的,则请求对象req将存储用户对象user,该对象可以被传递到下一个处理程序。

3. 示例说明

以下是两个示例说明,用于演示如何在Express.js框架中实现这种Token验证方式。

示例1

const express = require('express');
const bodyParser = require('body-parser');
const jwt = require('jsonwebtoken');

const app = express();
const port = 3000;
const secret = 'ThisIsASampleSecretKey';

// 安全验证中间件函数,用于校验Token的有效性
function verifyToken(req, res, next) {
  const authHeader = req.headers.authorization;
  if (!authHeader) {
    return res.sendStatus(401);
  }

  const token = authHeader.split(' ')[1];

  jwt.verify(token, secret, (err, user) => {
    if (err) {
      return res.sendStatus(403);
    }

    req.user = user;
    next();
  });
}

// 模拟用户登录接口
app.post('/login', (req, res) => {
  // 此处省略验证用户登录信息的代码
  const user = { id: 1, username: 'testuser' };

  const token = jwt.sign({ sub: user.id }, secret, { expiresIn: '24h' });

  res.json({ token });
});

// 需要进行安全验证的API接口
app.get('/api/posts', verifyToken, (req, res) => {
  res.json({ message: '您已登录用户' });
});

// 在本地启动服务器
app.listen(port, () => {
  console.log(`Server started at http://localhost:${port}`);
});

在这个示例中,首先是一个/post/login路由,用于用户登录。当用户通过POST /login路由提交登录凭证时,应用程序将检查用户凭证,并如果凭证通过验证,则使用jsonwebtoken模块生成一个Token,并将Token返回给客户端。

其次,还有一个/api/posts路由,用于对请求进行安全验证。当没有有效的Token或者Token不正确时,该路由将会返回403状态码。如果Token正确,则返回一个JSON字符串。

示例2

另一个示例是在Express.js应用程序中使用jsonwebtoken模块的更直接的实现。以下代码片段演示了如何在Express.js应用程序中使用jsonwebtoken模块。

const express = require('express');
const jwt = require('jsonwebtoken');
const app = express();

// 安全验证中间件函数,用于校验Token的有效性
function verifyToken(req, res, next) {
  const token = req.headers['x-access-token'];
  if (!token) {
    return res.status(403).send({ 
      message: '请提供有效Token' 
    });
  }

  jwt.verify(token, config.secret, (err, user) => {
    if (err) {
      return res.status(401).send({
        message: 'Token无效,请重新登录'
      });
    }
    req.user = user;
    next();
  });
};

// 用于验证用户登录的路由
app.post('/api/login', (req, res) => {
  const {username, password} = req.body;
  const user = {
    id: 1,
    username,
    password
  };
  // 用户凭证验证省略
  const token = jwt.sign({ id: user.id }, config.secret, {
    expiresIn: 86400 // 24小时过期时间
  });
  res.status(200).send({
    auth: true,
    token
  });
});

// 需要进行安全验证的API
app.get('/api/user', verifyToken, (req, res) => {
  res.status(200).send(req.user);
});

// 在本地启动服务器
app.listen(3000, () => {
  console.log('Server running on port 3000');
});

在这个示例中,取代了调用verifyToken的中间件函数。在路由中直接使用verify函数进行身份验证,并返回相应的状态码。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Node登录权限验证token验证实现的方法示例 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • node.js中的fs.fstat方法使用说明

    Node.js 中的 fs.fstat 方法使用说明 Node.js 的 fs 模块提供了一组丰富的文件系统 API,这些 API 可以通过 JavaScript 实现文件读写、创建、删除等常见操作。其中,fs.fstat 方法用于返回文件的状态信息,如文件的大小、修改时间等。 语法 fs.fstat(fd[, options], callback) fd:…

    node js 2023年6月8日
    00
  • nodeJs实现基于连接池连接mysql的方法示例

    接下来我会为您详细讲解“Node.js实现基于连接池连接MySql的方法示例”的攻略。 步骤一:安装mysql模块 在开始使用Node.js连接MySQL数据库之前,需要先安装Node.js的MySQL模块。可以使用npm包管理器进行安装,具体命令如下: npm install mysql –save 安装完成后,可以使用以下代码测试是否成功安装: con…

    node js 2023年6月9日
    00
  • 详解nodejs模板引擎制作

    详解Node.js模板引擎制作 什么是模板引擎 模板引擎是一种将数据和模板文本结合起来产生新文本的工具。模板引擎允许我们使用模板文本生成我们需要的HTML、XML、JSON等格式的文本。互联网浏览器解析HTML是一件非常耗费性能的事情,而且HTML中可以嵌入静态资源、样式、脚本等,模板引擎可以将大量的相同或类似的内容进行复用,让前端渲染部分变得更加灵活和高效…

    node js 2023年6月8日
    00
  • node作为中间服务层如何发送请求(发送请求的实现方法详解)

    当我们开发前端应用时,有时需要向后端服务器发送请求获取数据,并将数据展示在页面上。但是在实际开发中,直接向后端服务器发送请求可能存在一些问题,例如跨域、频繁请求等问题。因此,我们可以使用node作为中间服务层,来发送请求。 Node.js中有一些第三方模块可以用于发送请求,比如: axios:一个基于Promise的HTTP客户端,可以用于发送GET、POS…

    node js 2023年6月8日
    00
  • JavaScript中的一些实用小技巧总结

    下面我会详细讲解JavaScript中的一些实用小技巧总结,主要包括以下内容: 数组操作技巧 对象操作技巧 字符串操作技巧 函数操作技巧 1. 数组操作技巧 1.1 数组去重 可以通过 Set 类型和 Array.from() 方法来去重数组: const arr = [1, 2, 2, 3, 3, 4]; const newArr = Array.from…

    node js 2023年6月8日
    00
  • typescript在node.js下使用别名(paths)无效的问题详解

    我来给您讲解一下。 问题现象 在使用Typescript编写Node.js应用程序时,我们有时会使用到Webpack或者tsconfig.json的paths字段设置路径别名,但是在实际使用中会出现别名无法生效的问题。这是因为Node.js默认不支持paths别名设置。 解决方案 解决这个问题的方法有两种: 方案一:使用Babel插件 我们可以使用Babel…

    node js 2023年6月8日
    00
  • Node.js Windows Binary二进制文件安装方法

    Node.js是一种运行在服务器端的JavaScript语言,它能够使得服务器端和客户端都是用JavaScript进行开发,且能够在Windows环境下运行。我们可以通过Windows Binary二进制文件来安装Node.js,本篇攻略将会详细讲解如何进行安装。 步骤一:下载Node.js二进制文件 我们需要去Node.js官网下载适用于Windows的二…

    node js 2023年6月8日
    00
  • Nodejs进阶:基于express+multer的文件上传实例

    下面我将介绍一下“Nodejs进阶:基于express+multer的文件上传实例”的完整攻略。 简介 在Web应用程序开发中,文件上传是一个非常常见的需求。Node.js 提供了强大的文件系统模块,可以轻松读取和写入文件。而 Express 框架则提供了处理 HTTP 请求和响应的能力。 Multer 是一款 Node.js 中用于处理 multipart…

    node js 2023年6月8日
    00
合作推广
合作推广
分享本页
返回顶部