JWT令牌简单例子

Java代码

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

public class JwtUtils {

    private static final String SECRET_KEY = "yourSecretKey";
    private static final long EXPIRATION_TIME = 864_000_000; // 10 days

    /**
     * 生成JWT令牌
     *
     * @param username 用户名
     * @return JWT令牌
     */
    public static String generateToken(String username) {
        // 创建payload,可以存储一些自定义的信息
        Map<String, Object> claims = new HashMap<>();

        // 设置过期时间
        Date expirationDate = new Date(System.currentTimeMillis() + EXPIRATION_TIME);

        // 生成JWT令牌
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(username)
                .setIssuedAt(new Date())
                .setExpiration(expirationDate)
                .signWith(SignatureAlgorithm.HS256, SECRET_KEY)
                .compact();
    }

    /**
     * 从JWT令牌中解析出用户名
     *
     * @param token JWT令牌
     * @return 用户名
     */
    public static String getUsernameFromToken(String token) {
        // 解析JWT令牌中的Claims(包含payload)
        Claims claims = Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody();

        // 从Claims中获取用户名
        return claims.getSubject();
    }

    /**
     * 验证JWT令牌是否有效
     *
     * @param token    JWT令牌
     * @param username 用户名
     * @return true表示令牌有效,false表示令牌无效
     */
    public static boolean validateToken(String token, String username) {
        // 从令牌中解析出的用户名与传入的用户名进行比较,同时检查令牌是否过期
        return getUsernameFromToken(token).equals(username) && !isTokenExpired(token);
    }

    /**
     * 检查JWT令牌是否过期
     *
     * @param token JWT令牌
     * @return true表示令牌已过期,false表示令牌尚未过期
     */
    private static boolean isTokenExpired(String token) {
        // 解析JWT令牌中的Claims(包含payload),检查令牌的过期时间
        Date expiration = Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)
                .getBody()
                .getExpiration();

        // 检查过期时间是否在当前时间之前
        return expiration.before(new Date());
    }
}

Maven代码

<dependency>
    <groupId>io.jsonwebtoken</groupId>
    <artifactId>jjwt</artifactId>
    <version>0.9.1</version>
</dependency>
### JSON Web Token (JWT) 的概念 JSON Web Token(JWT)是一种开放标准(RFC 7519),设计用于在网络应用环境下的安全信息传输[^2]。其核心功能是以一种紧凑和自包含的方式,在客户端与服务器之间传递声明信息。这种声明信息可以包括用户的身份验证数据或其他元数据。 JWT的主要优点在于它的简洁性和可扩展性,使其非常适合于分布式系统的身份验证以及信息交换场景。通过签名机制,JWT能够确保消息的真实性和完整性,防止篡改行为的发生[^3]。 --- ### JWT 的结构组成 JWT由三个部分构成,分别是头信息(Header)、消息体(Payload)和签名(Signature)。这三个部分通过点号`.`连接在一起形成最终的Token字符串: #### 1. **Head Information** 头部通常采用JSON格式编码,并经过Base64Url处理后成为第一部分。它包含了令牌所使用的加密算法类型以及其他元数据。例如: ```json { "alg": "HS256", "typ": "JWT" } ``` #### 2. **Message Body (Payload)** 负载部分也是以JSON形式存在并转换成Base64Url表示法作为第二段内容。这部分承载着实际要发送的数据或者说是“声明”。这些声明分为注册声明、公共声明和私有声明三种类别。 - 注册声明是由IETF RFC文档定义好的字段; - 公共声明则可供开发者自由定制但需避免冲突; - 私有声明则是特定应用程序内部约定的内容。 #### 3. **Digital Signature / Message Authentication Code** 最后的部分是对前面两部分内容按照指定哈希函数计算得出的结果再做一次Base64Url编码得到第三段。如果使用的是HMAC SHA系列,则会利用共享密钥完成此操作;若是RSA或ECDSA公钥体系下,则依赖对应的私钥来进行签署过程。 以下是创建一个简单JWT例子: ```python import base64 import hashlib import hmac import json def create_jwt(header, payload, secret_key): # Encode header and payload to Base64URL encoded_header = base64.urlsafe_b64encode(json.dumps(header).encode()).rstrip(b'=') encoded_payload = base64.urlsafe_b64encode(json.dumps(payload).encode()).rstrip(b'=') # Create the signature using HMAC-SHA256 algorithm with a secret key signing_input = f"{encoded_header.decode()}.{encoded_payload.decode()}".encode() signature = hmac.new(secret_key.encode(), signing_input, hashlib.sha256).digest() # Convert the signature into Base64URL format encoded_signature = base64.urlsafe_b64encode(signature).rstrip(b'=') return f"{encoded_header.decode()}.{encoded_payload.decode()}.{encoded_signature.decode()}" # Example usage of creating a JWT token header_example = {"alg": "HS256", "typ": "JWT"} payload_example = {"sub": "1234567890", "name": "John Doe", "iat": 1516239022} secret_key_example = 'my_secret' jwt_token = create_jwt(header_example, payload_example, secret_key_example) print(jwt_token) ``` 上述代码展示了如何手动生成一个JWT令牌的过程,其中`create_jwt()`函数接收头部、载荷以及秘密钥匙参数来构建完整的JWT字符串。 --- ### 安全注意事项 尽管JWT提供了便捷的安全特性,但在实施过程中仍需要注意潜在漏洞风险。比如当设置不当可能导致攻击者轻易修改权限级别等问题发生时就需要格外小心对待每一个细节配置项的选择与管理策略制定工作[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值