jsonwebtoken 使用教程

本文档记录了使用Koa中间件实现JWT(JSON Web Tokens)的生成、验证和过期时间计算。核心功能包括生成token、验证token及计算剩余有效期。在实际项目中,务必对jwt.verify进行错误处理,以防token失效或无效时引发错误。

本系列是我的常用 koa 中间件使用笔记,防止忘记使用方法而作记录

 

基本使用

const jwt = require('jsonwebtoken');

const secretKey = '&*^R*G&(FRDwp4eg3'   //secret
const expiresIn = 60 * 60 * 24 * 30;    //时效 (秒)

//生成jwt
function generateToken(uid) {
    const token = jwt.sign({
        uid
    }, secretKey, {
        expiresIn
    })
    return token
}

//解析jwt
function verifyToken(token) {
    return jwt.verify(token, secretKey)
}


//计算剩余时间
function tokenExp(token) {
    let verify = verifyToken(token);
    let time = parseInt((new Date().getTime()) / 1000);
    return `剩余${verify.exp - time}秒`
}

let token = generateToken(1);

console.log(token);                //输出token
console.log(verifyToken(token));   //输出token内容
tokenExp(token);        //输出token剩余时间

以上封装了三个函数,常用的功能就是这些了。

在实际项目中必须要对jwt.verify进行try catch捕捉错误,因为如果token过期或者无效会直接抛出错误。 

 

<think>我们正在处理一个关于JWT工具使用教程和开发指南的问题。根据用户的需求,我们需要提供如何使用JWT工具进行开发的教程和指南。我们将参考提供的引用内容,特别是引用[1](Python实现)、引用[2](Java实现)和引用[3](Spring Boot整合)以及引用[4](应用指南)中的信息。 由于用户没有指定具体的编程语言,我们将提供两种常见语言的示例:Python(使用PyJWT库)和Java(使用jjwt库)。同时,我们也会介绍JWT的基本概念和工作流程。 ### 回答结构: 1. **JWT基础介绍**:简要说明JWT是什么,它的结构和工作原理。 2. **JWT工作流程**:通过流程图说明JWT在认证过程中的使用。 3. **开发指南**:分语言(Python和Java)介绍如何使用相应的库生成和验证JWT。 4. **安全注意事项**:提醒用户在使用JWT时需要注意的安全问题。 5. **在线工具**:介绍一些有用的在线工具,用于调试和解析JWT。 --- ### JWT基础介绍 JSON Web Token (JWT) 是一种开放标准(RFC 7519),用于在各方之间安全地传输信息。JWT 由三部分组成:头部(Header)、载荷(Payload)和签名(Signature)。它们通过点号连接,形如:`xxxxx.yyyyy.zzzzz`。 - **头部(Header)**:通常由两部分组成,令牌类型(即JWT)和所使用的签名算法(如HMAC SHA256或RSA)。 示例: ```json { "alg": "HS256", "typ": "JWT" } ``` - **载荷(Payload)**:包含声明(claims)。声明是关于实体(通常是用户)和附加数据的语句。有三种类型的声明:注册声明、公共声明和私有声明。 示例: ```json { "sub": "1234567890", "name": "John Doe", "admin": true } ``` - **签名(Signature)**:使用编码后的头部和载荷,加上一个密钥(secret)或私钥,通过头部中指定的算法生成签名。 ### JWT工作流程 引用[4]提供了一个JWT认证流程: 1. 客户端通过用户名和密码向服务器发起登录请求(POST /login)。 2. 服务器验证用户信息(通常与数据库交互),验证成功后生成JWT令牌。 3. 服务器将JWT令牌返回给客户端。 4. 客户端在后续请求的HTTP头部(Authorization: Bearer <token>)中携带该令牌。 5. 服务器验证JWT的签名和有效期,如果有效则返回受保护资源。 ### 开发指南 #### Python 实现(使用 PyJWT) 引用[1]提到了使用PyJWT库实现JWT的生成和验证。 1. **安装PyJWT**: ```bash pip install pyjwt ``` 2. **生成JWT**: ```python import jwt import datetime # 密钥,用于签名 SECRET_KEY = "your_secret_key" # 载荷 payload = { 'user_id': 123, 'username': 'john_doe', 'exp': datetime.datetime.utcnow() + datetime.timedelta(minutes=30) # 过期时间 } # 生成JWT token = jwt.encode(payload, SECRET_KEY, algorithm='HS256') print(token) ``` 3. **验证JWT**: ```python try: decoded_payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256']) print(decoded_payload) except jwt.ExpiredSignatureError: print("Token已过期") except jwt.InvalidTokenError: print("无效Token") ``` #### Java 实现(使用 jjwt) 引用[2]和[3]提到了使用jjwt库(新版)实现JWT。 1. **添加依赖(Maven)**: ```xml <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.5</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.11.5</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.11.5</version> <scope>runtime</scope> </dependency> ``` 2. **生成JWT**: ```java import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.Keys; import java.security.Key; import java.util.Date; Key key = Keys.secretKeyFor(SignatureAlgorithm.HS256); // 生成安全的密钥 // 设置过期时间 long nowMillis = System.currentTimeMillis(); Date now = new Date(nowMillis); Date exp = new Date(nowMillis + 3600000); // 1小时后过期 String jws = Jwts.builder() .setSubject("user123") .setIssuedAt(now) .setExpiration(exp) .signWith(key) .compact(); System.out.println(jws); ``` 3. **验证JWT**: ```java try { Jwts.parserBuilder() .setSigningKey(key) .build() .parseClaimsJws(jws); // 验证成功 } catch (Exception e) { // 验证失败 } ``` ### 安全注意事项 - **密钥安全**:密钥(secret key)必须保密,不能硬编码在代码中或存储在客户端。 - **令牌有效期**:设置合理的过期时间(通常较短),以防止令牌被长期滥用。 - **使用HTTPS**:在传输过程中使用HTTPS,防止令牌被截获。 - **避免敏感数据**:不要在载荷中存储敏感数据,因为JWT可以被解码(但不一定被修改)。 ### 在线工具 - **jwt.io**:一个常用的在线JWT调试工具,可以解析和验证JWT令牌[^1]。 --- ### 相关问题 1. JWT 如何防止被篡改? 2. 在分布式系统中如何管理 JWT 的注销? 3. 除了 HS256 算法,JWT 还支持哪些签名算法?如何选择? 4. JWT 和 OAuth2 有什么关系? 通过以上步骤,你应该能够开始使用JWT进行开发。根据你的具体技术栈选择相应的库实现即可。</think>### JWT 工具开发指南 #### 一、JWT 基础概念 JWT(JSON Web Token)是一种用于安全传输信息的开放标准(RFC 7519),由三部分组成: 1. **头部(Header)**:指定算法和令牌类型 ```json { "alg": "HS256", "typ": "JWT" } ``` 2. **载荷(Payload)**:携带用户声明数据 ```json { "sub": "user123", "exp": 1717220000 } ``` 3. **签名(Signature)**:验证完整性的加密串 $$ \text{签名} = \text{HMAC-SHA256}(\text{base64UrlEncode(header)} + "." + \text{base64UrlEncode(payload)}, \text{secret}) $$ #### 二、核心开发流程(以 Python 为例) 1. **安装 PyJWT 库** ```bash pip install pyjwt ``` 2. **生成 JWT** ```python import jwt import datetime secret = "your_secret_key" payload = { "user_id": 123, "exp": datetime.datetime.utcnow() + datetime.timedelta(hours=1) # 1小时过期 } token = jwt.encode(payload, secret, algorithm="HS256") print(token) # 输出:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... ``` 3. **验证 JWT** ```python try: decoded = jwt.decode(token, secret, algorithms=["HS256"]) print(decoded) # 输出载荷数据 except jwt.ExpiredSignatureError: print("令牌已过期") except jwt.InvalidTokenError: print("无效令牌") ``` #### 三、Java 实现(使用 jjwt 库) 1. **Maven 依赖** ```xml <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.5</version> </dependency> ``` 2. **生成与验证代码** ```java import io.jsonwebtoken.*; Key key = Keys.hmacShaKeyFor("secret".getBytes()); // 生成令牌 String jws = Jwts.builder() .setSubject("user123") .setExpiration(new Date(System.currentTimeMillis() + 3600000)) .signWith(key) .compact(); // 验证令牌 Jws<Claims> claims = Jwts.parserBuilder() .setSigningKey(key) .build() .parseClaimsJws(jws); ``` #### 四、关键安全实践 1. **密钥管理** - 使用强密钥(长度≥32字符) - 通过环境变量注入密钥,禁止硬编码 ```python import os secret = os.environ["JWT_SECRET"] ``` 2. **有效期控制** - 短期令牌:访问令牌(1小时) - 长期令牌:刷新令牌(7天),需独立存储 3. **敏感数据防护** - 载荷中禁止存放密码等敏感信息 - 使用 HTTPS 传输令牌 #### 五、调试工具推荐 1. [jwt.io 在线调试器](https://jwt.io): - 实时解析令牌结构 - 验证签名有效性 2. **命令行工具`jwt-cli`**: ```bash npm install -g jwt-cli jwt decode eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9... ``` > 流程图:JWT 认证流程 > ```mermaid > graph LR > A[客户端] -->|1. 提交凭证| B(认证服务) > B -->|2. 验证数据库| C[(数据库)] > B -->|3. 生成JWT| A > A -->|4. 携带JWT请求| D[业务API] > D -->|5. 验证签名/有效期| B > D -->|6. 返回数据| A > ``` [^1]: JWT 格式化完全指南:从原理到 Python 实现与在线工具应用 [^2]: 现代Java开发:使用jjwt实现JWT认证 [^3]: JWT最详细教程以及整合SpringBoot的使用 [^4]: 从入门到实战:JWT 令牌在 Web 开发中的应用指南 --- ### 相关问题 1. JWT 与 Session 认证机制有何本质区别? 2. 如何实现 JWT 令牌的主动撤销机制? 3. 在微服务架构中如何安全传递 JWT? 4. 使用 RSA 非对称加密签名 JWT 的最佳实践是什么?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值