JWT令牌

 JWT令牌

  • 引入依赖
    <!-- JWT依赖-->
    <dependency>
        <groupId>io.jsonwebtoken</groupId>
        <artifactId>jjwt</artifactId>
        <version>0.9.1</version>
    </dependency>

    在引入完JWT来赖后,就可以调用工具包中提供的API来完成JWT令牌的生成和校验。工具类:Jwts

  • 引入JWT工具类:在项目工程下创建 com.itheima.util 包,并把提供JWT工具类复制到该包下

    package com.itheima.util;
    
    import io.jsonwebtoken.Claims;
    import io.jsonwebtoken.Jwts;
    import io.jsonwebtoken.SignatureAlgorithm;
    
    import java.util.Date;
    import java.util.Map;
    
    public class JwtUtils {
    
        private static String signKey = "SVRIRUlNQQ==";
        private static Long expire = 43200000L;
    
        /**
         * 生成JWT令牌
         * @return
         */
        public static String generateJwt(Map<String,Object> claims){
            String jwt = Jwts.builder()
                    .addClaims(claims)
                    .signWith(SignatureAlgorithm.HS256, signKey)
                    .setExpiration(new Date(System.currentTimeMillis() + expire))
                    .compact();
            return jwt;
        }
    
        /**
         * 解析JWT令牌
         * @param jwt JWT令牌
         * @return JWT第二部分负载 payload 中存储的内容
         */
        public static Claims parseJWT(String jwt){
            Claims claims = Jwts.parser()
                    .setSigningKey(signKey)
                    .parseClaimsJws(jwt)
                    .getBody();
            return claims;
        }
    }
    

  • 完善 EmpServiceImpl中的 login 方法逻辑, 登录成功,生成JWT令牌并返回

    @Override
    public LoginInfo login(Emp emp) {
        Emp empLogin = empMapper.getUsernameAndPassword(emp);
        if(empLogin != null){
            //1. 生成JWT令牌
            Map<String,Object> dataMap = new HashMap<>();
            dataMap.put("id", empLogin.getId());
            dataMap.put("username", empLogin.getUsername());
            
            String jwt = JwtUtils.generateJwt(dataMap);
            LoginInfo loginInfo = new LoginInfo(empLogin.getId(), empLogin.getUsername(), empLogin.getName(), jwt);
            return loginInfo;
        }
        return null;
    }

### 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]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值