NodeJS使用JWT跨域身份验证方案详解

NodeJS使用JWT跨域身份验证方案详解

什么是JWT?

JWT(JSON Web Token)是一种基于JSON编码的轻量级的身份验证方式。它可以安全的用于通信双方之间传递信息,以验证发送方是否有权发送信息,并且可以保证接收方信息的完整性和真实性。 JWT由三部分组成,分别是header、payload和signature,而每一部分都是使用Base64编码形式的。

JWT的使用场景

  1. 在身份验证过程中传递信息(例如登录凭证)
  2. 为特定的资源授权(例如操作权限,访问权限等)

JWT工作流程

假设,在使用JWT验证的场景下,客户端发出请求向服务端获取被保护的资源,那么该验证过程会按照下面的流程进行。

  1. 客户端向服务器发送请求,携带JWT身份信息。
  2. 服务器接收到请求后,验证JWT身份信息是否正确。
  3. 如果验证成功,服务器会返回被保护的资源;否则,服务器不会返回被保护的资源。

JWT使用方法

  1. 安装jsonwebtoken模块
npm install jsonwebtoken
  1. 引入jsonwebtoken模块
const jwt = require('jsonwebtoken');
  1. 创建JWT
// jwt.sign(payload, secretOrPrivateKey, [options, callback])
// payload - 负载,用来存放需要安全传输的信息
// secretOrPrivateKey - 加密所需要的密钥,可以是字符串,也可以是缓存格式的私密密码,如果使用默认加密算法是HSA则用字符串
// options - 生成的Token的一些选项参数
// callback - 密钥所在的回调函数
jwt.sign({ foo: 'bar' }, 'secretKey', { expiresIn: '2h' }, function(err, token) {
  console.log(token);
});
  1. 验证JWT
// jwt.verify(token, secretOrPublicKey, [options, callback])
// token - 需要验证的token数据
// secretOrPublicKey - 负责生成加密的secretKey或者公钥
// options - 验证的一些选项参数
// callback - 验证过程中所需的回调
jwt.verify(token, 'secretKey', function(err, decoded) {
  console.log(decoded.foo) //bar
});

JWT跨域身份验证实现示例

为了方便示例说明,我们假定实现一个网站,该网站请求资源需要登录。前端使用Ajax发送请求,后端使用NodeJS构建。

  1. 在前端,首先需要在登录成功后创建JWT,然后每次请求时携带JWT发送到服务端。
//登录后创建JWT,存储到localStorage中
axios.post('/login', { username: 'admin', password: 'password' })
  .then((response) => {
    const token = response.token;
    localStorage.setItem('token', token);
  });

//每次请求时携带JWT发送到服务端
axios.get('/protected', { headers: { Authorization: `Bearer ${localStorage.getItem('token')}` }})
  .then((response) => {
    console.log(response.data);
  });
  1. 在服务端,首先需要验证JWT的有效性,如果验证成功则给予授权,返回请求的资源;否则则返回401错误。
const express = require('express');
const jwt = require('jsonwebtoken');

const app = express();
const port = 3000;

app.use(express.json());

//登录验证
app.post('/login', (req, res) => {
  //验证账号密码逻辑省略,模拟成功返回token
  const token = jwt.sign({ username: 'admin' }, 'secretKey', { expiresIn: '2h' });
  res.send({ token });
});

//被保护的资源, 需要登录验证
app.get('/protected', verifyToken, (req, res) => {
  res.send('success');
});

//验证jwt合法性的中间件
function verifyToken(req, res, next) {
  const bearerHeader = req.headers['authorization'];
  if (typeof bearerHeader !== 'undefined') {
    const bearerToken = bearerHeader.split(' ')[1];
    req.token = bearerToken;
    jwt.verify(req.token, 'secretKey', (err, authData) => {
      if (err) {
        res.sendStatus(401);
      } else {
        next();
      }
    });
  } else {
    res.sendStatus(401);
  }
}

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`);
});

这样,前端每次请求资源时都会携带JWT,服务端通过校验JWT的有效性给予授权,返回被保护的资源。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:NodeJS使用JWT跨域身份验证方案详解 - Python技术站

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

相关文章

  • 使用Dockerfile部署nodejs服务的方法步骤

    当您需要部署一个 Node.js 项目时, Docker 是非常方便的工具。您可以通过 Dockerfile 定义一个容器镜像,这个镜像中包含您的 Node.js 项目和一些系统依赖,您可以简单地使用这个镜像来启动容器并运行服务。下面以一个示例来讲解如何使用 Dockerfile 部署 Node.js 服务。 步骤一:创建 Dockerfile 在您的 No…

    node js 2023年6月8日
    00
  • Nest.js快速启动API项目过程详解

    下面是“Nest.js快速启动API项目过程详解”的完整攻略,包括示例说明。 一、安装环境 首先,需要安装Node.js和npm(或者yarn),如果你还没有安装的话,可以参考Node.js官网进行下载和安装。 安装完成后,可以通过以下命令来验证是否安装成功: node -v npm -v 执行以上命令会分别输出Node.js和npm(或者yarn)的版本号…

    node js 2023年6月8日
    00
  • 教你30秒发布一个TypeScript包到NPM的方法步骤

    创建 NPM 账号 首先,你需要在 NPM 官网注册一个账号。注册账号很简单,只需要填写几个基本信息即可。若你已有账号,请跳过此步。 初始化工程 创建工程文件夹,进入此文件夹,初始化工程: npm init (在终端输入该命令后,按照提示输入参数) 安装 TypeScript 在终端输入以下命令: npm install typescript –save-…

    node js 2023年6月9日
    00
  • 浅析node.js中close事件

    下面我将为你详细讲解“浅析node.js中close事件”。 什么是close事件? 在Node.js中,close事件是一个简单的事件监听器,它是在流(stream)或者网络套接字(socket)的连接关闭时触发的。例如:当客户端从服务端断开连接时,服务端会收到一个close事件。 close事件的原理 close事件的原理是,当一个连接被关闭时,Node…

    node js 2023年6月8日
    00
  • node.js中express中间件body-parser的介绍与用法详解

    下面是本攻略的完整内容,包括介绍、用法以及代码示例。 介绍 在 Node.js 的 Web 开发中,处理请求参数是非常常见的操作。其中,body-parser 是一个非常常用的中间件,它用来解析 HTTP 请求体中的参数,并挂载到 request 对象上供后续中间件或路由处理。 body-parser 中间件支持多种格式的请求体数据,包括 JSON、urle…

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

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

    node js 2023年6月8日
    00
  • nodejs实现获取当前url地址及url各种参数值

    首先,我们需要安装Node.js,然后创建一个新的Node.js项目,并安装url核心模块来解析URL。 在项目中,我们可以通过内置的http模块来创建一个HTTP服务器,然后处理客户端请求,其中URL是重要的一部分。我们可以使用req.url属性来获取当前URL地址。接下来,我们可以使用url.parse()方法来将URL解析为URL对象,从而获取其中的参…

    node js 2023年6月8日
    00
  • 如何写Node.JS版本小游戏

    为了让攻略更加详细,我将对“如何写Node.js版本小游戏”进行以下分步详解: 第一步:选择游戏类型 Node.js 作为一种服务器端语言,可以用于制作各种类型的游戏,比如猜数游戏、飞翔游戏、多人游戏等。在选择游戏类型时,需要考虑以下因素: 适合玩家年龄段。 游戏玩法能否符合玩家预期。 制作成本和开发难度。 通过选择适合的游戏类型能够提高游戏的质量,适合的游…

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