JWT全面解读和详细使用步骤

JWT全面解读和详细使用步骤

什么是JWT?

JWT(JSON Web Token)是用于身份验证和授权的开放标准(RFC 7519),根据规范,JWT由三部分组成:头部(header)、荷载(payload)和签名(signature)。

头部

头部包含两个元素:令牌类型(通常是JWT)和所使用的签名算法(例如HMAC SHA256或RSA)。

使用json表示:

{
  "alg": "HS256",
  "typ": "JWT"
}

荷载

荷载包含需要传输的信息,如用户ID、用户名、角色、权限等信息。

使用json表示:

{
  "sub": "1234567890",
  "name": "Alice",
  "iat": 1516239022
}

在上面的数据中,“sub”表示主题(subject),“name”表示姓名,“iat”表示签发时间(Issued At),数字都是Unix时间戳。

签名

签名是将头部和荷载签名后的结果,保证数据的完整性和不可篡改性。签名需要使用头部中指定的算法进行加密计算。

JWT的使用流程

  1. 用户登录,将登录信息发送到服务器。
  2. 服务器验证用户信息是否正确,如果正确,生成JWT并返回给用户。
  3. 用户携带JWT请求资源。
  4. 服务器需要验证JWT的合法性,检查签名和荷载信息是否完整,从而确认用户身份。

JWT的优势

  1. 不需要在服务端存储会话信息,方便扩展和分布式部署。
  2. 使用数字签名,保证数据的完整性和不可篡改性。
  3. 可以设置过期时间,增强安全性。
  4. 使用标准化的格式,易于处理和交换信息。

JWT的缺点

  1. 信息放在荷载中,影响传输效率。
  2. 一旦签发,无法撤回,除非等到过期时间。
  3. 一旦密钥泄露,攻击者可伪造JWT获取访问权限。

JWT的使用步骤

  1. 安装jsonwebtoken:npm install jsonwebtoken --save
  2. 在服务器端使用jsonwebtoken生成JWT:
const jwt = require('jsonwebtoken');
const secret = 'thisisasecret';

const payload = { sub: '1234567890', name: 'Alice', iat: Math.floor(Date.now() / 1000) };
const token = jwt.sign(payload, secret, { expiresIn: '1h' });

console.log(token);

代码中,使用jsonwebtoken模块生成JWT,需要传入荷载、密钥和过期时间等参数,返回生成的JWT。

  1. 在客户端使用JWT:
const xhr = new XMLHttpRequest();
const token = 'xxxxx'; // 从服务器获取到的JWT
xhr.open('GET', 'url');
xhr.setRequestHeader('Authorization', `Bearer ${token}`);
xhr.send();

代码中,使用XMLHttpRequest请求资源,需要将JWT放在请求头的Authorization字段中,格式为Bearer \,进行发送。

示例一:Express使用JWT实现登录认证

const express = require('express');
const jwt = require('jsonwebtoken');
const users = [{ id: 1, name: 'Alice', password: 'alicepassword' }];

const app = express();
const secret = 'thisisasecret';

app.use(express.json());

app.post('/login', (req, res) => {
  const { name, password } = req.body;
  const user = users.find(u => u.name === name && u.password === password);

  if (user) {
    const payload = { id: user.id, name: user.name };
    const token = jwt.sign(payload, secret, { expiresIn: '1h' });
    res.json({ token });
  } else {
    res.status(401).json({ message: 'Invalid username or password' });
  }
});

const authHandler = (req, res, next) => {
  const header = req.headers.authorization;
  if (header) {
    const token = header.split(' ')[1];
    jwt.verify(token, secret, (err, payload) => {
      if (err) {
        res.status(403).json({ message: 'Failed to authenticate token' });
      } else {
        req.user = payload;
        next();
      }
    });
  } else {
    res.status(401).json({ message: 'No token provided' });
  }
};

app.get('/protected', authHandler, (req, res) => {
  res.json({
    message: `Welcome ${req.user.name} to the protected resource`,
  });
});

app.listen(3000, () => {
  console.log('Server started on port 3000');
});

代码中使用Express框架实现登录认证功能,在路由‘/login’中当用户输入正确的用户名和密码时,服务器会生成JWT并返回给客户端。用户访问路由‘/protected’时,需要经过authHandler中间件,检查JWT的合法性,如果验证成功,则允许用户访问受保护的资源。

示例二:使用Axios发送带有JWT的请求

const axios = require('axios');
const jwt = require('jsonwebtoken');

const secret = 'thisisasecret';

const payload = { sub: '1234567890', name: 'Alice', iat: Math.floor(Date.now() / 1000) };
const token = jwt.sign(payload, secret, { expiresIn: '1h' });

const config = {
  headers: {
    'Authorization': `Bearer ${token}`
  }
};

axios.get('url', config)
  .then(response => {
    console.log(response.data);
  })
  .catch(error => {
    console.error(error);
  });

代码中使用Axios发送GET请求时,在请求头中添加JWT,格式同上,Axios会自动将对象转换为JSON格式并发送请求。如果成功,则输出响应数据;如果失败,则输出错误信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JWT全面解读和详细使用步骤 - Python技术站

(0)
上一篇 2023年5月19日
下一篇 2023年5月19日

相关文章

  • spark rdd转dataframe 写入mysql的实例讲解

    要将Spark RDD转换成DataFrame,并将其写入MySQL,您可以按照以下步骤进行操作: 第1步:导入库 假设您已经在Spark和MySQL上安装了适当的依赖项。在这个例子中,我们将使用Spark Core,Spark SQL和MySQL connector。请确保将这些库导入到您的代码库中。 from pyspark.sql import Spa…

    Java 2023年5月20日
    00
  • Spring MVC项目中的异常处理详解

    下面是关于“Spring MVC项目中的异常处理详解”的完整攻略,包含两个示例说明。 Spring MVC项目中的异常处理详解 在Spring MVC项目中,异常处理是非常重要的。本文将介绍如何在Spring MVC项目中处理异常,并提供两个示例说明。 步骤一:定义异常类 首先,我们需要定义一个异常类来处理异常。可以通过继承Exception类或Runtim…

    Java 2023年5月17日
    00
  • Ajax+Servlet实现无刷新下拉联动效果

    下面是详细的攻略。 一、什么是无刷新下拉联动效果 “无刷新下拉联动效果”指的是在一个下拉框中选择某一项时,另一个下拉框中的内容会实时地发生改变,而不需要重新加载整个页面。Ajax+Servlet是实现这一效果的主要技术手段。 二、实现步骤 1.创建HTML页面 首先,需要在HTML页面中创建两个下拉框及其对应的显示文本框。 <form> <…

    Java 2023年6月15日
    00
  • 详解 maven的pom.xml用解决版本问题

    下面就是关于“详解 Maven 的 pom.xml 用 解决版本问题”的完整攻略。 概述 当在Maven项目中出现依赖jar包与自己项目中的相关版本不兼容时,可以通过在pom.xml文件中使用<exclusion>标签来排除掉该依赖中不兼容的包,保证项目的正常运行。 详解步骤 接下来详细介绍如何使用<exclusion>标签解决版本问…

    Java 2023年6月2日
    00
  • vuejs 动态添加input框的实例讲解

    下面是关于“vuejs 动态添加input框的实例讲解”的完整攻略: 1. 需求分析 在编写一个表单页面时,通常需要动态添加表单项,比如当用户需要输入多个电话号码时,我们需要在页面上动态添加多个电话输入框。这时我们可以使用 Vue.js 来实现动态添加 input 框。 2. 实现动态添加 input 框的步骤 2.1 定义数据 我们需要定义一个数组来存储 …

    Java 2023年6月15日
    00
  • 史上最全最强SpringMVC详细示例实战教程(图文)

    “史上最全最强SpringMVC详细示例实战教程(图文)”是一篇非常详细的SpringMVC教程,其中包含了众多实战示例,可以帮助初学者深入了解SpringMVC框架,掌握相关开发技术和实现方法。本文将详细讲解整篇教程的内容,包括主要内容、实现方法、示例说明等。 主要内容 “史上最全最强SpringMVC详细示例实战教程(图文)”主要涵盖以下内容: Spri…

    Java 2023年5月16日
    00
  • Java中为何要使用ArrayList

    Java 是一门面向对象的编程语言,封装、继承和多态等特性是其特色。在实际应用中,常常需要使用到集合类来存储和操作对象集合。而 ArrayList 就是 Java 中比较常见、使用广泛的一种集合类。 ArrayList 的概述 ArrayList 是基于数组实现的动态数组,可以随时根据实际情况调整容量大小。ArrayList 实现了 List 接口,因此它还…

    Java 2023年5月26日
    00
  • PHP 巧用数组降低程序的时间复杂度

    PHP巧用数组降低程序的时间复杂度 在PHP开发中,数组是常用的数据类型之一。通过巧妙地运用数组,可以降低程序的时间复杂度,提高程序效率。接下来,我们将探讨如何使用数组降低程序的时间复杂度。 使用数组代替循环 通常情况下,我们需要在数组中查找特定的元素。如果使用循环进行遍历查找,时间复杂度为O(n),而使用In_array函数则可以将时间复杂度降至O(1)。…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部