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日

相关文章

  • Spring Security源码解析之权限访问控制是如何做到的

    首先,Spring Security是一个基于Spring框架的安全框架,它提供了身份认证和授权等功能,帮助我们防止各种安全攻击,保障我们的应用程序安全。 Spring Security的权限访问控制是通过访问控制表达式来实现的,可以在配置文件中配置。访问控制表达式包含了许多参数和操作符,用于判断用户是否有权访问特定的资源。具体来说,Spring Secur…

    Java 2023年5月20日
    00
  • SSM框架整合之Spring+SpringMVC+MyBatis实践步骤

    SSM框架整合之Spring+SpringMVC+MyBatis实践步骤 SSM框架整合是Java Web开发中常用的一种方式,它将Spring、SpringMVC和MyBatis三个框架整合在一起,可以提高开发效率和代码质量。本文将详细介绍SSM框架整合的实践步骤,并提供两个示例说明。 实践步骤 步骤一:创建Maven项目 首先,我们需要创建一个Maven…

    Java 2023年5月17日
    00
  • 并行收集器的作用是什么?

    并行收集器是JVM中的一种垃圾收集器,它会利用多个CPU核心同时进行垃圾收集,以提高垃圾收集的效率和性能。下面我们来详细讲解并行收集器的作用及使用攻略。 并行收集器的作用 并行收集器主要用于大规模的应用程序或者需要执行大量的垃圾收集操作的应用程序,它的主要作用是在垃圾收集时利用多个CPU核心来加速垃圾收集的过程,从而减少应用程序因垃圾回收而被阻塞的时间。同时…

    Java 2023年5月10日
    00
  • Spring Boot中是如何处理日期时间格式的

    Spring Boot中处理日期时间格式主要通过在实体类中使用注解@JsonFormat来完成。@JsonFormat是Jackson中的注解,可用于序列化和反序列化Java的日期和时间类型。 以下是处理日期时间格式的详细步骤: 在实体类的日期字段上添加@DateTimeFormat注解来指定日期时间格式,例如:yyyy-MM-dd。 在实体类的日期字段上添…

    Java 2023年5月20日
    00
  • Java定时器Timer简述

    Java定时器(Timer)是Java提供的一种机制,用来执行定时任务。它允许你在一个特定的时间间隔内反复地,或者仅仅是一次性地,执行某个代码段。在本文中,我们将详细讲解Java定时器的使用,包括创建Timer对象、添加任务、设定任务执行间隔等。 创建Timer对象 首先,我们需要创建一个定时器Timer对象。可以使用如下代码来创建: Timer timer…

    Java 2023年6月1日
    00
  • 详解Java前缀树Trie的原理及代码实现

    详解Java前缀树(Trie)的原理及代码实现,下面是完整攻略: 1. 前缀树(Trie)的原理 前缀树,又叫字典树,是一种以树形结构来存储查询词条或单词的查找树。它的根节点不包含字符,每一个代表字符串中一个字符的节点内包含一个字符,从根节点到某一个节点的路径上经过的字符串连接起来即为该节点表示的字符串。 前缀树的查询通常是从根节点开始,根据查询词的字符在树…

    Java 2023年5月19日
    00
  • Javamelody监控不到sql的问题(亲测有效) ​

    下面是“Javamelody监控不到sql的问题(亲测有效)​”的完整攻略: 问题描述 在使用 Javamelody 监控应用程序时,有时可能会发现监控面板上并没有显示 SQL 相关的信息,导致无法进行有效的数据库性能分析。 解决方法 修改应用程序的配置 在应用程序的配置文件中,需要添加以下配置项: <bean id="monitoringD…

    Java 2023年6月15日
    00
  • Java生成和解析XML格式文件和字符串的实例代码

    下面我将详细讲解“Java生成和解析XML格式文件和字符串的实例代码”的完整攻略以及其中的两个示例。 1. 什么是XML XML是可扩展标记语言(Extensible Markup Language)的缩写,它是一种用于传输和存储数据的标准格式。XML是自我描述、可扩展的,可以通过文本编辑器或工具生成并解析。在Java应用程序中,XML是一种常见的数据交换格…

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