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

yizhihongxing

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日

相关文章

  • node的process以及child_process模块学习笔记

    下面是“node的process以及child_process模块学习笔记”的完整攻略。 process模块 在Node.js中,process是一个全局对象,提供了与当前Node.js进程相关的信息和控制。我们可以使用process对象来获取进程的信息、设置进程的环境变量等。 获取命令行参数 process.argv属性包含了当前进程的命令行参数。它是一个…

    node js 2023年6月8日
    00
  • 基于nodejs的微信JS-SDK简单应用实现

    作为网站的作者,我很高兴为大家介绍“基于nodejs的微信JS-SDK简单应用实现”的完整攻略。 具体步骤 1. 注册开发者账号 首先需要在微信公众平台上注册成为开发者,得到相应的AppID和AppSecret。具体步骤如下: 打开微信公众平台官网 点击右上角“注册”,按照提示进行填写 注册完成后登录,进入管理后台 在左侧导航栏中找到“开发->基本配置…

    node js 2023年6月8日
    00
  • Nodejs之TCP服务端与客户端聊天程序详解

    “Nodejs之TCP服务端与客户端聊天程序详解”是一篇关于使用Node.js编写TCP聊天程序的文章,完整攻略包括以下内容: 1. 环境搭建 首先,需要安装Node.js和npm。Node.js是一个基于JavaScript语言的服务器端运行环境,npm是Node.js的包管理工具。安装Node.js和npm后,可以使用npm安装必要的模块,如net模块、…

    node js 2023年6月8日
    00
  • Angular之jwt令牌身份验证的实现

    下面是“Angular之jwt令牌身份验证的实现”的完整攻略: 什么是JWT令牌 JSON Web Token(JWT)是一种轻量级的安全性访问令牌,主要用于在网络应用中传递被授权的信息。JWT由三部分组成,分别是头部、载荷和签名。 头部: 通常由两部分组成,类型和加密算法。 载荷: 所要传递的信息。 签名: 保证信息没有被篡改过。 在服务器端口生成令牌,将…

    node js 2023年6月8日
    00
  • 详解nodeJS之路径PATH模块

    详解Node.js之路径模块(Path module) 简介 在Node.js中,核心模块之一是路径模块(Path module)。该模块提供了处理和转换文件路径的工具方法。 使用方式 在Node.js中,我们可以使用require关键字导入路径模块。例如: const path = require(‘path’); 在导入模块后,我们可以使用该模块提供的方…

    node js 2023年6月8日
    00
  • nodejs开发微博实例

    下面是使用nodejs开发微博实例的完整攻略: 1. 概述 本攻略主要介绍如何使用nodejs进行微博开发的过程,包括前后端的架构、功能的实现、数据存储等方面。 2. 前后端架构 前端使用Vue.js框架实现,后端使用node.js搭建,并使用express框架处理路由、数据存储等功能。使用MySQL数据库存储用户信息、微博内容等数据。 3. 功能实现 3.…

    node js 2023年6月8日
    00
  • Nodejs进阶:express+session实现简易登录身份认证

    下面我将为你详细讲解“Nodejs进阶:express+session实现简易登录身份认证”的完整攻略。本攻略主要分为以下几个部分: 什么是session express-session的使用 实现简易登录身份认证的步骤 示例说明 什么是session 在Web开发中,我们常常需要通过用户的身份认证来实现一些特殊的操作。而在HTTP的无状态协议中,为了保存用…

    node js 2023年6月8日
    00
  • node.js中的console.warn方法使用说明

    当开发者在使用Node.js编写应用程序时,经常需要在代码中打印输出调试信息。Node.js提供了console模块来处理输出,其中console.warn()方法可以用于在控制台输出警告信息。 1. 使用说明 1.1 语法 console.warn([data][, …args]) 1.2 参数 data:警告信息,可以是字符串,也可以是任意JavaS…

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