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

yizhihongxing

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和ES6的模块导出与导入

    详解node和ES6的模块导出与导入 什么是模块 模块是JS代码的组织单元。一个模块中包含了一些独立的、可重用的代码。模块化提供了更好的代码重用,更好的代码管理,并且可以提供更好的性能。 在早期,JS程序的模块化靠的是IIFE(立即执行函数表达式)模式。但是这种模式需要手动处理模块依赖关系并且容易出错。 现代 JS 应用的模块化通常采用 ES6 的模块功能,…

    node js 2023年6月8日
    00
  • 利用node实现一个批量重命名文件的函数

    实现一个批量重命名文件的函数,可以通过Node.js提供的fs核心模块完成。下面是详细的实现攻略: 1. 引入fs模块 const fs = require(‘fs’); 2. 定义重命名函数 function batchRenameFiles(dirPath, oldNameRegex, newNameString) { fs.readdir(dirPat…

    node js 2023年6月8日
    00
  • 用node开发并发布一个cli工具的方法步骤

    用node开发并发布一个cli工具是一个适合有一定Node.js经验的开发者的技能。这里提供了一个完整的攻略,让你了解如何在Node.js中开发并发布一个cli工具。 步骤 创建工程 首先,你需要创建一个空文件夹来存储你的工程。我们将其称为“my-cli-tool”。然后,通过执行以下命令创建一个package.json文件: npm init -y 这将生…

    node js 2023年6月8日
    00
  • webpack-dev-server的安装使用教程

    接下来我将为大家讲解“webpack-dev-server的安装使用教程”的完整攻略。 1. 安装webpack-dev-server 全局安装 我们可以使用以下命令来全局安装webpack-dev-server: npm install -g webpack-dev-server 本地安装 我们也可以在项目目录下使用以下命令来本地安装webpack-dev…

    node js 2023年6月9日
    00
  • 美团Java实习招聘面试经历总结【已拿到Offer】

    下面就来详细讲解“美团Java实习招聘面试经历总结【已拿到Offer】”的攻略: 核心经验 在做美团Java实习招聘面试准备时,主要需要掌握以下几个核心经验: 1. Java基础知识全面掌握 Java是美团面试Java实习时重点考察的知识点,要想顺利通过面试,首先需要掌握Java的基础知识,包括Java的数据类型、流程控制、面向对象编程、异常处理等等。此外,…

    node js 2023年6月8日
    00
  • NodeJS通过魔术封包唤醒局域网计算机实例

    NodeJS通过魔术封包唤醒局域网计算机实例 简介 在局域网环境中,如果计算机实例(比如服务器或者单片机等)处于待机状态,想要让其主动唤醒可能需要手动操作电源按钮或者在开机时设置开机启动等较为麻烦的方式。本文将介绍如何通过 NodeJS 编写实现局域网计算机实例的远程唤醒。 网卡的 Magic Packet 特性 局域网中的网络适配器(网卡)都支持一项叫做 …

    node js 2023年6月8日
    00
  • 解决Node.js mysql客户端不支持认证协议引发的问题

    问题描述 在使用 Node.js MySQL 客户端时,可能会遇到以下错误: Error: ER_NOT_SUPPORTED_AUTH_MODE: Client does not support authentication protocol requested by server; consider upgrading MySQL client 这个错误发…

    node js 2023年6月8日
    00
  • ES6 十大特性简介

    下面就为大家详细讲解一下 “ES6 十大特性简介”。 1. let 和const let 与 var 的区别:let 声明的变量只在其块级作用域内有效。 const:定义一个只读常量,一旦定义,其值就不可改变。 // let 示例 let a = 1; if(true){ let a = 2; console.log(a); // 2 } console.l…

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