文章目录1. JWT令牌介绍1.1 什么是JWT1.2 JWT的结构1.3 JWT的应用场景2 如何配置JWT令牌2.1 修改UAA工程配置JWT令牌服务2.2 修改业务模块的代码本地检查令牌1. JWT令牌介绍1.1 什么是JWTJWTJSON Web Token是一种开放标准RFC 7519用于在各方之间安全地传输信息作为JSON对象。它由三部分组成头部Header、载荷Payload和签名Signature通过点号.分隔。JWT的主要特点紧凑性体积小可通过URL、POST参数或HTTP头部传输自包含性包含所有必要信息减少数据库查询安全性使用签名确保令牌不被篡改标准化基于JSON格式跨语言支持良好1.2 JWT的结构一个典型的JWT令牌格式xxxxx.yyyyy.zzzzz1. 头部Header{alg:HS256,typ:JWT}alg签名算法如HS256、RS256typ令牌类型固定为JWT2. 载荷Payload包含声明claims分为三类注册声明预定义的声明如iss签发者、exp过期时间、sub主题公共声明可自定义但应避免冲突私有声明自定义声明用于传递业务数据3. 签名Signature使用头部指定的算法对编码后的头部和载荷进行签名确保令牌完整性。1.3 JWT的应用场景身份认证用户登录后服务器生成JWT返回给客户端授权访问受保护资源时客户端携带JWT信息交换安全地在各方之间传递信息2 如何配置JWT令牌2.1 修改UAA工程配置JWT令牌服务1)配置JWT令牌存储和密钥这里配置加密和解密相同密码publicclassTokenConfig{privateStringSIGNING_KEY123456;// Bean// public TokenStore tokenStore(){// /**// * 使用内存存储令牌(普通令牌)// */// return new InMemoryTokenStore();// }/** * 配置JWT令牌存储 * return */BeanpublicTokenStoretokenStore(){returnnewJwtTokenStore(accessTokenConverter());}BeanpublicJwtAccessTokenConverteraccessTokenConverter(){JwtAccessTokenConverterconverternewJwtAccessTokenConverter();converter.setSigningKey(SIGNING_KEY);returnconverter;}}(2) 配置AuthorizationServer 令牌增强...............AutowiredprivateClientDetailsServiceclientDetailsService;................//令牌增强TokenEnhancerChaintokenEnhancerChainnewTokenEnhancerChain();tokenEnhancerChain.setTokenEnhancers(Arrays.asList(accessTokenConverter));service.setTokenEnhancer(tokenEnhancerChain);3获取令牌测试。启动UAA后获取令牌可以看到令牌的长度比较厂格式如何JWT令牌格式。4 校验令牌测试。拿到前面的令牌使用/uaa/oauth/check_token 接口查看令牌内容。2.2 修改业务模块的代码本地检查令牌1在order工程中配置config下创建TokenConfig代码与UAA下面的TokenConfig一致packagecom.it2.security.distributed.order.config;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.security.oauth2.provider.token.TokenStore;importorg.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter;importorg.springframework.security.oauth2.provider.token.store.JwtTokenStore;ConfigurationpublicclassTokenConfig{privateStringSIGNING_KEY123456;// Bean// public TokenStore tokenStore(){// /**// * 使用内存存储令牌(普通令牌)// */// return new InMemoryTokenStore();// }/** * 配置JWT令牌存储 * return */BeanpublicTokenStoretokenStore(){returnnewJwtTokenStore(accessTokenConverter());}BeanpublicJwtAccessTokenConverteraccessTokenConverter(){JwtAccessTokenConverterconverternewJwtAccessTokenConverter();converter.setSigningKey(SIGNING_KEY);returnconverter;}}(2) 将TokenStore 注入到资源服务中使用,并注释之前的远程令牌验证AutowiredprivateTokenStoretokenStore;Overridepublicvoidconfigure(ResourceServerSecurityConfigurerresources)throwsException{resources.resourceId(RESOURCE_ID)//资源id.tokenStore(tokenStore)//自己验证令牌// .tokenServices(tokenService()) //验证令牌的服务.stateless(true);}3启动order服务,并关闭UAA使用刚刚获取的JWT令牌访问r1资源.可以正常访问说明了业务服务没有使用远程认证的方式校验令牌而是自己本地校验令牌。