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

yizhihongxing

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日

相关文章

  • 基于javaweb+jsp实现学生宿舍管理系统

    下面是基于javaweb+jsp实现学生宿舍管理系统的完整攻略。 一、前期准备 学习Java语言和Web开发知识,熟悉JSP和Servlet等技术; 了解MySQL等数据库的基本操作; 确定需求,设计数据库表结构等。 二、搭建开发环境 安装Java开发工具和Web服务器; 配置开发环境,包括环境变量、路径等; 创建工程并配置Web服务器相关信息。 三、实现功…

    Java 2023年5月24日
    00
  • idea添加数据库图文教程

    接下来我将为您讲解”IDEA添加数据库图文教程”的完整攻略。本攻略分为以下几个步骤: 下载安装MySQL 在IDEA中打开Database工具窗口 添加MySQL驱动程序 添加MySQL数据源 测试连接 打开数据表 示例操作 下面将分别进行详细讲解。 第一步:下载安装MySQL MySQL是一种流行的关系型数据库,您需要将其下载并安装到您的计算机上。您可以在…

    Java 2023年5月20日
    00
  • 消息中间件ActiveMQ的简单入门介绍与使用

    消息中间件ActiveMQ的简单入门介绍与使用 什么是ActiveMQ ActiveMQ是一款开源的消息中间件,它采用Java编写,完全支持JMS规范,是Apache软件基金会的顶级项目之一。ActiveMQ可以通过网络将不同应用程序之间异构的数据进行传输,是一种比较通用的解决方案。 ActiveMQ的基本概念 在了解如何使用ActiveMQ之前,有几个基本…

    Java 2023年5月20日
    00
  • SpringBoot全局异常处理方式

    当我们使用SpringBoot开发应用程序时,难免会遇到各种异常,在没有对异常进行处理时,用户会得到一些看不懂或不能理解的提示信息,这对于用户来说是非常不友好的,所以我们需要设置全局异常处理方式来帮助用户更好地理解我们的应用程序。 以下是关于SpringBoot全局异常处理的完整攻略,包括两个示例: 1. 全局异常处理方式 在SpringBoot中,我们可以…

    Java 2023年5月19日
    00
  • java实现Base64加密解密算法

    Java实现Base64加密解密算法攻略 什么是Base64? Base64是一种将二进制数据编码成ASCII字符的方法,常用于在URL、Cookie、网页中传输少量二进制数据。它是由64个字符组成的字符集,其编码方式是将3个8位数的字符转换为4个6位数的字符,然后在6位数的前面补两个0的方法,即共有64个不同的编码字符,形如: A – Z, a – z, …

    Java 2023年5月19日
    00
  • 在RedHat系统上安装JDK与Tomcat的步骤

    将在RedHat系统上安装JDK和Tomcat的步骤分为以下几个步骤: 下载JDK并安装 访问Oracle官网的下载页面:https://www.oracle.com/java/technologies/javase-jdk16-downloads.html,选择对应的版本并下载JDK的安装文件。 将下载后的文件上传到RedHat系统中合适的文件夹中,如/o…

    Java 2023年5月19日
    00
  • 详解springMVC两种方式实现多文件上传及效率比较

    详解 Spring MVC 两种方式实现多文件上传及效率比较 本文将详细讲解 Spring MVC 两种不同的实现多文件上传的方式,并对其效率进行比较。示例代码为基于 Maven 的 Spring MVC 项目。 前置条件 JDK 1.8 或以上版本 Maven Servlet 3.0 或以上版本 Spring MVC 4.3 或以上版本 两种上传方式 Sp…

    Java 2023年6月16日
    00
  • 从零开始让你的Spring Boot项目跑在Linux服务器

    下面是从零开始让你的Spring Boot项目跑在Linux服务器的完整攻略。 一、准备工作1. 购买一台Linux服务器,获取root权限。2. 安装Java环境,可以使用yum安装或手动下载安装。 二、打包Spring Boot项目打包Spring Boot项目,生成可执行的jar包。使用以下命令进行打包: mvn package 三、上传jar包到服务…

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