JWT令牌基本使用

JWT令牌

JWT全称是JSON Web Token,它定义了一种简介的、自包含的格式,用于通信双方以json数据格式安全的传输信息。

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

jwt字符串组成:

第一部分:(eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9):Header(头),记录令牌类型,签名算法等,例如:{“alg”:"HS256;“type”:“JWT”} alg:表示算法 type:表示类型

第二部分:(eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ):PayLoad(有效载荷),携带一些自定义信息、默认信息等。例如:{“id”:“1”,“username”:“Tom”}等等

在JWT中会使用Base64(一种基于64个可打印的字符(A-Z a-z 0-9 + /)来表示二进制数据的编码方式。可以把任意数据转化成64个可打印的字符。)

注意:Base64是一种开源的编码方式,也就是说谁都可以通过解码的方式将第二部分的字符串解析,然后获取用户信息。

第三部分:

(SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c):Signature(签名)数字签名,防止Token(令牌)被篡改,确保安全性,将Header,Payload,并加入指定密钥,通过指定签名算法计算得来。

JWT-生成

①引入JWT坐标

<dependency>
            <groupId>com.auth0</groupId>
            <artifactId>java-jwt</artifactId>
            <version>4.4.0</version>
        </dependency>

②设置JWT获取类,保证能获取到加密后的String字符串。

package com.example.bigeventproject.Util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;

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

public class GetToken
{
    public String getToken(Map<String,Object> map)
    {
        String token= JWT.create()
                .withClaim("user",map)//添加载荷
                .withExpiresAt(new Date(System.currentTimeMillis()+1000*60*60*24*365)//过期时间
                ).sign(Algorithm.HMAC256("wuyaohui"));//sign是签名的意思,在这里要指定加密算法,在算法中指定密钥
        //算法:Algorithm.ECDSA384(密钥),算法都可以通过Algorithm来获取
        return token;
    }
}

sign是签名的意思,在这里要指定加密算法,在算法中指定密钥

算法:Algorithm.ECDSA384(密钥),算法都可以通过Algorithm来获取

测试一下:

@Test
    public void Test()
    {
        HashMap<String, Object> map=new HashMap<>();
        map.put("username","zhangsan");
        map.put("id",1);
        String token = GetToken.getToken(map);
        System.out.println(token);
    }

结果

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoxLCJ1c2VybmFtZSI6InpoYW5nc2FuIn0sImV4cCI6MTcwNzA2ODg5NX0.cxbAjCn2YIs4WhEv0G6khF-K3toxLxUEVYpBz6YpRXE

JWT验证

①写一个获取方法

 public static Map<String,Claim> parseToken(String token)
    {
        JWTVerifier jwtVerifier=JWT.require(Algorithm.HMAC256("wuyaohui")).build();
        DecodedJWT decodedJWT=jwtVerifier.verify(token);
        return decodedJWT.getClaims();
    }

②测试

@Test
    public void Test() {
        Map<String, Claim> stringClaimMap = GetToken.parseToken("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoxLCJ1c2VybmFtZSI6InpoYW5nc2FuIn0sImV4cCI6MTcwNzA2ODg5NX0.cxbAjCn2YIs4WhEv0G6khF-K3toxLxUEVYpBz6YpRXE");
        Claim id = stringClaimMap.get("user");
        System.out.println(id);
    }

注意:stringClaimMap.get(“参数”);这个方法的参数是你生成时加入的载荷名称。

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
使用JWT令牌实现登录功能可以增加系统的安全性和可扩展性。下面是一个基本的实现过程: 1. 用户通过用户名和密码进行登录请求。 2. 服务器验证用户的身份,并生成一个JWT令牌。 3. 服务器将JWT令牌发送给客户端作为登录凭证。 4. 客户端在后续的请求中将JWT令牌携带在请求头或者请求参数中。 5. 服务器在接收到请求时验证JWT令牌的有效性和签名。 6. 如果JWT令牌有效,则处理请求;否则,返回未授权的错误。 下面是一个示例代码(使用Node.js和jsonwebtoken库): ```javascript const jwt = require('jsonwebtoken'); // 登录处理 function login(username, password) { // 验证用户名和密码,生成用户对象 const user = authenticateUser(username, password); if (user) { // 生成JWT令牌 const token = jwt.sign({ id: user.id }, 'your_secret_key', { expiresIn: '1h' }); return token; } else { throw new Error('Invalid username or password'); } } // 请求处理中间件 function authenticateToken(req, res, next) { // 获取请求头中的Authorization字段 const authHeader = req.headers['authorization']; const token = authHeader && authHeader.split(' ')[1]; if (token == null) { return res.sendStatus(401); // 未授权 } // 验证JWT令牌 jwt.verify(token, 'your_secret_key', (err, user) => { if (err) { return res.sendStatus(403); // 令牌无效 } req.user = user; next(); // 验证通过,继续处理请求 }); } // 示例路由,需要进行身份验证 app.get('/protected', authenticateToken, (req, res) => { res.send('Protected data'); }); ``` 在上面的示例中,`login`函数用于生成JWT令牌。`authenticateToken`函数是一个请求处理中间件,用于验证JWT令牌的有效性。 注意,在实际使用中,你需要替换示例中的`your_secret_key`为一个安全的密钥,并根据自己的需求进行相应的调整。 希望这个例子能够帮到你,如果有更多问题,请随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值