电商系统-用户认证(三)基于公钥解析JWT令牌

一、 基于私钥生成jwt令牌

步骤:

导入认证服务

  1. 将shangcheng_user_auth工程导入到项目中去,如下图

  2. 启动eureka,再启动认证服务

3) 认证服务中创建测试类

public class CreateJwtTest {

java 复制代码
    /***
     * 创建令牌测试
     */
    @Test
    public void testCreateToken(){
        //证书文件路径
        String key_location="shangcheng.jks";
        //秘钥库密码
        String key_password="shangcheng";
        //秘钥密码
        String keypwd = "shangcheng";
        //秘钥别名
        String alias = "shangcheng";
​
        //访问证书路径
        ClassPathResource resource = new ClassPathResource(key_location);
​
        //创建秘钥工厂
        KeyStoreKeyFactory keyStoreKeyFactory = new KeyStoreKeyFactory(resource,key_password.toCharArray());
​
        //读取秘钥对(公钥、私钥)
        KeyPair keyPair = keyStoreKeyFactory.getKeyPair(alias,keypwd.toCharArray());
​
        //获取私钥
        RSAPrivateKey rsaPrivate = (RSAPrivateKey) keyPair.getPrivate();
​
        //定义Payload
        Map<String, Object> tokenMap = new HashMap<>();
        tokenMap.put("id", "1");
        tokenMap.put("name", "itheima");
        tokenMap.put("roles", "ROLE_VIP,ROLE_USER");
​
        //生成Jwt令牌
        Jwt jwt = JwtHelper.encode(JSON.toJSONString(tokenMap), new RsaSigner(rsaPrivate));
​
        //取出令牌
        String encoded = jwt.getEncoded();
        System.out.println(encoded);
    }
}
 

二、 基于公钥解析jwt令牌

上面创建令牌后,我们可以对JWT令牌进行解析,这里解析需要用到公钥,我们可以将之前生成的公钥public.key拷贝出来用字符串变量token存储,然后通过公钥解密。

在shangcheng-user-oauth创建测试类com.shangcheng.token.ParseJwtTest实现解析校验令牌数据,代码如下:

java 复制代码
public class ParseJwtTest {
​
    /***
     * 校验令牌
     */
    @Test
    public void testParseToken(){
        //令牌
        String token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJyb2xlcyI6IlJPTEVfVklQLFJPTEVfVVNFUiIsIm5hbWUiOiJpdGhlaW1hIiwiaWQiOiIxIn0.IR9Qu9ZqYZ2gU2qgAziyT38UhEeL4Oi69ko-dzC_P9-Vjz40hwZDqxl8wZ-W2WAw1eWGIHV1EYDjg0-eilogJZ5UikyWw1bewXCpvlM-ZRtYQQqHFTlfDiVcFetyTayaskwa-x_BVS4pTWAskiaIKbKR4KcME2E5o1rEek-3YPkqAiZ6WP1UOmpaCJDaaFSdninqG0gzSCuGvLuG40x0Ngpfk7mPOecsIi5cbJElpdYUsCr9oXc53ROyfvYpHjzV7c2D5eIZu3leUPXRvvVAPJFEcSBiisxUSEeiGpmuQhaFZd1g-yJ1WQrixFvehMeLX2XU6W1nlL5ARTpQf_Jjiw";
​
        //公钥
        String publickey = "-----BEGIN PUBLIC KEY-----MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvFsEiaLvij9C1Mz+oyAmt47whAaRkRu/8kePM+X8760UGU0RMwGti6Z9y3LQ0RvK6I0brXmbGB/RsN38PVnhcP8ZfxGUH26kX0RK+tlrxcrG+HkPYOH4XPAL8Q1lu1n9x3tLcIPxq8ZZtuIyKYEmoLKyMsvTviG5flTpDprT25unWgE4md1kthRWXOnfWHATVY7Y/r4obiOL1mS5bEa/iNKotQNnvIAKtjBM4RlIDWMa6dmz+lHtLtqDD2LF1qwoiSIHI75LQZ/CNYaHCfZSxtOydpNKq8eb1/PGiLNolD4La2zf0/1dlcr5mkesV570NxRmU1tFm8Zd3MZlZmyv9QIDAQAB-----END PUBLIC KEY-----";
​
        //校验Jwt
        Jwt jwt = JwtHelper.decodeAndVerify(token, new RsaVerifier(publickey));
​
        //获取Jwt原始内容
        String claims = jwt.getClaims();
        System.out.println(claims);
        //jwt令牌
        String encoded = jwt.getEncoded();
        System.out.println(encoded);
    }
}

注:

对于令牌的解析,公钥和私钥是成对出现的,用正确的公钥去解析相对应的以私钥作为签名的JWT令牌,否则的话无法进行解析。

相关推荐
總鑽風2 天前
单点登录sso 微服务加网关gateway
java·微服务·gateway·jwt·单点登录
易生一世4 天前
JWT详解
json·证书·jwt·token·ai skills
庞轩px7 天前
权限系统设计复盘——从RBAC模型到JWT双Token,方法级权限控制的完整实现
鉴权·jwt·rbac·aop·自定义注解·权限系统·双token
深念Y14 天前
Codex 买号登录问题排查与 auth.json 手动配置记录
gpt·jwt·coding·codex·email·refresh_token·access_token
Devin~Y17 天前
大厂Java面试实录:Spring Boot/Cloud + Redis/Kafka + JWT + RAG/Agent(小Y翻车版)
java·spring boot·redis·spring cloud·kafka·spring security·jwt
Devin~Y24 天前
大厂 Java 面试实战:Spring Boot 微服务 + Redis 缓存 + Kafka 消息 + Kubernetes + RAG(小Y水货翻车记)
java·spring boot·redis·kafka·spring security·jwt·oauth2
蓝色的杯子1 个月前
JWT 到底怎么用?一篇讲透 + FastAPI 鉴权实战
python·fastapi·jwt
成为大佬先秃头1 个月前
开放标准(RFC 7519):JSON Web Token (JWT)
spring boot·后端·json·jwt
成为大佬先秃头1 个月前
前后分离项目:整合JWT+Shiro
java·springboot·shiro·jwt
弹简特1 个月前
【JavaEE34-博客系统案例实战】从零开始撸一个博客系统(二):登录 + JWT令牌 + 强制登录,让系统先有“门卫”
jwt·博客系统·java实战