前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >java JWT:JSON Web Token 详解

java JWT:JSON Web Token 详解

作者头像
井九
发布2024-10-12 10:38:47
发布2024-10-12 10:38:47
38000
代码可运行
举报
文章被收录于专栏:四楼没电梯四楼没电梯
运行总次数:0
代码可运行

JWT(JSON Web Token)是一种用于在各方之间安全传递信息的紧凑型、URL安全的令牌。它在现代 Web 应用中非常常见,尤其是在分布式系统和微服务架构中,主要用于身份验证和授权机制。本文将介绍 JWT 的基本概念、结构,并结合 Spring BootNode.js 等框架的实际应用场景,通过代码示例深入解析其原理与用法。同时,还会推荐一些常用的 JWT 工具,帮助你更好地理解和调试 JWT。

一、JWT 的结构

JWT 是由三个部分组成的,使用点号(.)分隔:

  1. Header:头部,通常包含令牌的类型(JWT)和签名算法。
  2. Payload:负载,包含用户信息或声明(Claims),比如用户 ID、用户名等。
  3. Signature:签名,确保令牌未被篡改。

一个 JWT 示例:

代码语言:javascript
代码运行次数:0
复制
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
1. Header

Header 通常包括两部分信息:声明类型(JWT)和签名算法(如 HMAC SHA-256)。

代码语言:javascript
代码运行次数:0
复制
{
  "alg": "HS256",
  "typ": "JWT"
}
2. Payload

Payload 部分存储声明(Claims),可以包括标准声明(如 sub, iat, exp),也可以是自定义声明。

代码语言:javascript
代码运行次数:0
复制
{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
3. Signature

Signature 是通过对 HeaderPayload 进行编码后,结合一个密钥和指定的算法生成的。对于 HMAC SHA256 的签名生成过程如下:

代码语言:javascript
代码运行次数:0
复制
HMACSHA256(
  base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

Signature 的作用是确保 JWT 的内容未被篡改。

二、JWT 的应用场景

1. 身份验证

JWT 最常见的使用场景是身份验证。用户登录成功后,服务器生成一个 JWT 并返回给客户端。客户端随后每次请求时都携带该 JWT,服务器通过验证 JWT 来确认用户身份。

2. 授权

JWT 还可用于授权。用户在访问某些受限资源时,服务器通过解析 JWT 确认用户是否具备权限。常见的 RESTful API 授权就是通过 JWT 来完成的。

三、JWT 的优缺点

优点
  • 跨平台支持:JWT 是基于 JSON 的格式,几乎所有编程语言都可以解析和生成它。
  • 轻量级:JWT 可以存储在客户端,无需服务器维护会话状态。
  • 安全性:通过签名机制确保 JWT 未被篡改,并结合 HTTPS 提供额外的传输层安全性。
缺点
  • 无法撤销:JWT 一旦签发,除非过期或刷新,否则无法主动注销或撤销。
  • 体积较大:如果 Payload 中包含大量信息,可能会影响网络性能。

四、结合 Spring Boot 实现 JWT

Spring Boot 中,常用 jjwt 库来生成和验证 JWT。

1. 引入依赖

pom.xml 中引入以下依赖:

代码语言:javascript
代码运行次数:0
复制
<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>
2. 生成 JWT
代码语言:javascript
代码运行次数:0
复制
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

public class JwtUtil {
    private static final String SECRET_KEY = "mySecretKey";

    public static String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }
}
3. 验证 JWT
代码语言:javascript
代码运行次数:0
复制
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;

public class JwtUtil {
    public static Claims verifyToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();
    }
}
4. 应用 JWT 的 Controller
代码语言:javascript
代码运行次数:0
复制
@RestController
public class AuthController {

    @PostMapping("/login")
    public ResponseEntity<?> login(@RequestBody LoginRequest request) {
        // 验证用户登录
        if (isValidUser(request)) {
            String token = JwtUtil.generateToken(request.getUsername());
            return ResponseEntity.ok(new JwtResponse(token));
        }
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
    }

    @GetMapping("/protected")
    public ResponseEntity<?> getProtectedResource(@RequestHeader("Authorization") String token) {
        if (JwtUtil.verifyToken(token) != null) {
            return ResponseEntity.ok("Protected data");
        }
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
    }
}

五、结合 Node.js 实现 JWT

Node.js 中,可以使用 jsonwebtoken 库来处理 JWT。

1. 安装依赖
代码语言:javascript
代码运行次数:0
复制
npm install jsonwebtoken
2. 生成 JWT
代码语言:javascript
代码运行次数:0
复制
const jwt = require('jsonwebtoken');
const secretKey = 'mySecretKey';

function generateToken(username) {
    return jwt.sign({ username: username }, secretKey, { expiresIn: '1h' });
}
3. 验证 JWT
代码语言:javascript
代码运行次数:0
复制
function verifyToken(token) {
    try {
        return jwt.verify(token, secretKey);
    } catch (e) {
        return null;
    }
}
4. 应用 JWT 的路由
代码语言:javascript
代码运行次数:0
复制
const express = require('express');
const app = express();

app.post('/login', (req, res) => {
    const username = req.body.username;
    const token = generateToken(username);
    res.json({ token: token });
});

app.get('/protected', (req, res) => {
    const token = req.headers['authorization'];
    if (verifyToken(token)) {
        res.json({ data: 'Protected data' });
    } else {
        res.status(401).send('Unauthorized');
    }
});

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

六、JWT 的查看和编解码工具

为了方便开发者调试 JWT,以下是几个常用的 JWT 编解码工具:

1. JWT.io

JWT.io 是一个在线的 JWT 编解码工具。它可以帮助你解码、验证和生成 JWT,方便调试和查看 JWT 的 HeaderPayloadSignature

使用方法:
  • 打开 JWT.io 网站。
  • 将 JWT 粘贴到左侧的输入框中,右侧会显示解码结果,并提供验证签名的选项。
2. jwt-decode

jwt-decode 是一个轻量级的 JavaScript 库,用于解码 JWT,而无需验证签名。它非常适合在客户端快速调试或查看 JWT 数据。

安装:
代码语言:javascript
代码运行次数:0
复制
npm install jwt-decode
使用:
代码语言:javascript
代码运行次数:0
复制
const jwtDecode = require('jwt-decode');

const token = 'your.jwt.token';
const decoded = jwtDecode(token);

console.log(decoded);
3. Postman

Postman 是常用的 API 调试工具。它可以自动解析和附加 JWT,帮助你测试带有 JWT 的 API 请求。

使用方法:
  • 在请求头的 Authorization 选项中选择 Bearer Token,并将 JWT 粘贴其中,即可自动完成授权。
4. Python PyJWT

PyJWT 是 Python 中用于处理 JWT 的库,适合开发和调试 Python 项目中的 JWT。

安装:
代码语言:javascript
代码运行次数:0
复制
pip install pyjwt
使用:
代码语言:javascript
代码运行次数:0
复制
import jwt

token = 'your.jwt.token'

# 解码 JWT
decoded = jwt.decode(token, options={"verify_signature": False})
print(decoded)

七、总结

JWT 是一种灵活、轻量且跨平台的身份验证和授权方式。在现代 Web 应用中,尤其是分布式架构和微服务中,JWT 广泛用于处理用户身份验证和权限管理。通过本文的介绍,你不仅可以了解 JWT 的基本原理,还可以结合 Spring BootNode.js 实现 JWT 认证系统,并利用常用的调试工具提升开发效率。希望本文能帮助你更好地理解并运用 JWT。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-09-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、JWT 的结构
    • 1. Header
    • 2. Payload
    • 3. Signature
  • 二、JWT 的应用场景
    • 1. 身份验证
    • 2. 授权
  • 三、JWT 的优缺点
    • 优点
    • 缺点
  • 四、结合 Spring Boot 实现 JWT
    • 1. 引入依赖
    • 2. 生成 JWT
    • 3. 验证 JWT
    • 4. 应用 JWT 的 Controller
  • 五、结合 Node.js 实现 JWT
    • 1. 安装依赖
    • 2. 生成 JWT
    • 3. 验证 JWT
    • 4. 应用 JWT 的路由
  • 六、JWT 的查看和编解码工具
    • 1. JWT.io
      • 使用方法:
    • 2. jwt-decode
      • 安装:
      • 使用:
    • 3. Postman
      • 使用方法:
    • 4. Python PyJWT
      • 安装:
      • 使用:
  • 七、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档