JWT令牌技术(新手学习日记)

sJWT令牌 全称:JSON Web Token (ww.jwt.io)

组成:

        第一部分 : Header(头) , 记录令牌类型 , 签名算法等.

        第二部分: Paylaoad(有效载荷) , 携带一些自定义信息,默认信息等. (不要往里面存敏感信息 账号 密码等)

        第三部分 : Signature(签名) , 放置Token 被篡改 ,确保安全性 将header , payload 并加入指定秘钥 , 通过指定签名算法计算而来

Base64 : 是一种基于64个可打印字符(A-Z a-z 0-9 + /)来标识二进制数据的编码方式

本身数据是json格式,根据Base64编码,变成字符串 将经过编码的三个部分组成令牌即JWT令牌

JWT流程:

        令牌生成: 登录成功后,生成JWT令牌并返回给前端

        令牌检验: 在请求到达服务端后,对令牌进行统一拦截,校验

场景 : 登录认证

1.登录成功后, 服务端生成令牌,将令牌返回给浏览器存储

2.后续每个请求,都要携带JWT令牌,系统在每次请求处理之前,先校验令牌,通过后,再处理

生成 :

        第一步 导入依赖:

<dependency>
     <groupId>io.jsonwebtoken</groupId> 
     <artifactId>jjwt</artifactId> 
     <version>0.9.1</version> 
</dependency>
 //如果出现报错的情况,请导入下面的pom依赖 
<dependency> 
     <groupId>javax.xml.bind</groupId>
     <artifactId>jaxb-api</artifactId>
     <version>2.3.1</version> 
</dependency>

         第二步 生成令牌:

void Insert() {
    //将令牌荷载添加进Map<String, Object>的键值对中 
    Map<String, Object> claims = new HashMap<>();
    //存储信息
    claims.put("id", "1");
    claims.put("username", "tom");
    
    String jwt = Jwts.builder()
            .signWith(SignatureAlgorithm.HS256, "hevttc")//设置签名算法和秘钥
            .setClaims(claims)//荷载 = 自定义内容
            //根据当前的毫秒值加一个小时的时间作为过期时间 , 1000ms = 1s 一个小时 3600s
            .setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000)) //口令过期时间
            .compact();

    System.out.println(jwt);
}

令牌破解:

        因为令牌是使用Base64编码组成的字符串,所以使用Base64解码工具即可看到其中信息

假如刚刚生成的口令为:

eyJhbGciOiJIUzI1NiJ9.eyJpZCI6IjEiLCJleHAiOjE3MTg3MDE2MDQsInVzZXJuYW1lIjoidG9tIn0.sEDW0vEIMGzmiiUl_aBJaBTTu0owOcjHxbKT1sHTkp0

进行base64编码的解码(jwt官网也有),可以看到其中的信息,荷载中加了一个属性exp 它存储截止时间的毫秒值.

口令部分,经过了签名算法,算法不可逆,没办法反推信息 , 所以出现乱码

        承接上文,为什么不要往荷载里面存敏感信息,因为荷载中的账户密码等敏感信息经过令牌破解会有泄露风险

口令校验 :

public static void parseJwt(String token){
    Map<String, Object> claims = Jwts.parser()
            //签名秘钥
            .setSigningKey("hevttc")
            //输入解析口令
            .parseClaimsJws(token)
            //获取荷载(自定义信息)
            .getBody();
            //将获取的信息输出    
    System.out.println(claims);
}

如果口令出现报错信息, 说明口令被篡改或者逾期

JWT(JSON Web Token)是一种开放标准(RFC 7519),用于在网络应用环境间传递声明(claims)的紧凑的自包含方式。JWT 令牌技术在登录和身份验证流程中可以提供一种安全且简洁的方法来处理身份验证和信息交换。以下是使用 JWT 进行登录及身份验证的一般流程: 1. 用户登录:用户通过登录界面输入用户名和密码,后端系统验证这些凭据的正确性。 2. 生成 JWT 令牌:一旦用户身份被验证,后端服务就会创建一个 JWT 令牌,并将其返回给用户。该令牌通常包含三个部分: - Header(头部):通常包含两部分信息:令牌类型(即 JWT),以及所使用的签名算法,如 HMAC SHA256 或 RSA。 - Payload(载荷):包含所谓的“声明”(claims),声明是关于实体(通常是用户)和其他数据的声明。claims可以是用户的权限、角色、令牌的有效时间等。 - Signature(签名):为了创建签名部分,您必须有编码后的 Header 和 Payload,然后使用密钥对它们进行签名。签名用于验证消息在此过程中未被篡改,并且在从服务器发送至客户端时保持了完整性。 3. 存储和传输:用户收到 JWT 令牌后,通常将其存储在客户端的本地存储中(例如 localStorage 或 sessionStorage),并在后续的请求中将其添加到 HTTP 头的 Authorization 字段中(通常以 "Bearer token" 的格式),用以访问受保护的资源。 4. 服务器验证:每当用户尝试访问一个受保护的路由或资源时,服务器端会解码并验证 JWT 令牌的有效性。服务器会检查签名、令牌的过期时间以及其他声明信息。 5. 响应:如果 JWT 令牌有效,服务器将处理用户请求并返回相应的数据或资源;如果无效,则返回错误信息。 以下是使用 Node.js 和 Express 实现 JWT 身份验证的一个简单例子: ```javascript const express = require('express'); const jwt = require('jsonwebtoken'); const bcrypt = require('bcryptjs'); // 假设我们有一个用户模型和验证用户的方法 const User = require('./models/User'); const verifyUser = require('./utils/verifyUser'); const app = express(); app.use(express.json()); // 登录接口 app.post('/login', async (req, res) => { const { username, password } = req.body; const user = await User.findOne({ username }); if (user && bcrypt.compareSync(password, user.password)) { const token = jwt.sign({ id: user._id }, 'secret_key', { expiresIn: '1h' }); res.status(200).json({ token }); } else { res.status(401).send('用户名或密码错误'); } }); // 受保护的路由 app.get('/protected', verifyUser, (req, res) => { // 这里处理业务逻辑 res.status(200).send('protected route accessed'); }); app.listen(3000, () => { console.log('Server is running on port 3000'); }); // 使用中间件来验证 JWT const verifyUser = (req, res, next) => { try { const token = req.headers.authorization.split(' ')[1]; // 假设请求中携带的格式为 'Bearer token' const decoded = jwt.verify(token, 'secret_key'); req.userId = decoded.id; next(); } catch (error) { res.status(401).send('Invalid token'); } }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值