1.商城项目--工程搭建2.电商项目-微服务网关介绍3.电商项目-微服务网关使用的问题4.电商项目-微服务网关限流5.电商项目--分布式文件存储FastDFS简介6.电商项目--分布式文件存储FastDFS搭建7.电商项目-跨域解决方案CORS8.电商项目-数据同步解决方案(一)9.电商项目-网站首页高可用(一)10.电商项目-网站首页高可用(二)11.电商项目-分布式ID12.电商系统-用户认证(一)13.运维工程师都做什么14.敏捷方法(kanban和Scrum)15.毕业设计-王者荣耀战队数据分析系统的设计与实现16.Linux系列(一)17.网络工程师职业简介和职业前景18.电商系统-用户认证(二)
19.电商系统-用户认证(三)基于公钥解析JWT令牌
20.电商项目-订单处理(一)处理超时未支付订单21.电商项目-微信支付(一)微信支付快速入门22.电商项目-分布式事务(一)23.电商项目-微信支付(二)微信支付二维码24.电商项目-微信支付(三)支付回调处理25.电商项目-分布式事务(二)分布式事务解决方案26.电商项目-分布式事务(三)基于Seata实现分布式事务27.电商项目-分布式事务(四)基于消息队列实现分布式事务一、 基于私钥生成JWT令牌
步骤:
1.导入认证服务,将shangcheng_user_auth工程导入到项目中去,如下图
2.启动eureka,再启动认证服务
3. 认证服务中创建测试类
/*** * 创建令牌测试 */ @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实现解析校验令牌数据,代码如下:
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令牌,否则的话无法进行解析。
标签:
用户认证
, 基于公钥解析JWT令牌
· [翻译] 为什么 Tracebit 用 C# 开发
· 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
· Deepseek官网太卡,教你白嫖阿里云的Deepseek-R1满血版
· DeepSeek崛起:程序员“饭碗”被抢,还是职业进化新起点?
· RFID实践——.NET IoT程序读取高频RFID卡/标签