伍佰目录 短网址
  当前位置:海洋目录网 » 站长资讯 » 站长资讯 » 文章详细 订阅RssFeed

忙里偷闲又把自己的JWT实现改进了一下

来源:本站原创 浏览:260次 时间:2021-05-05

之前在Spring Security 实战干货系列中我使用了 Spring 官方提供的spring-security-jwt作为JWT的实现。目前该工具包已经不再维护,而且对于最新推出的Spring Security OAuth2 Client 和 Spring Authorization Server都不是特别的兼容。所以抽了两天时间结合这两个新依赖重新实现了 JWT。

Nimbus 库

在目前最新的Spring Security中默认使用了Nimbus的 JOSE 库nimbus-jose-jwt。这个库目前是 JOSE 最常用的类库之一,大部分的改造工作都是围绕这个库开展的。

改造的过程分享

流程上跟 Spring Security 实战干货大致是一样的。

加载证书

证书依然使用 keytool 生成 2048 长度的 RSA 密钥。

这里之前使用了比较“暴力”的方式直接读取 KeyStore 然后使用公私钥,本次将 KeyStore 加载的证书转变为 JOSE 规范中的 JWK(Json Web Key)。

JWT

JWT 在 Spring Security 中被定义为org.springframework.security.oauth2.jwt.Jwt对象,对于 JWT 的操作可以抽象为两个方面。

生成 JWT

首先就是生成 JWT。目前的 Spring Security 本身是不提供这个能力的,只有在孵化中的Spring Authorization Server提供了生成 JWT 的抽象接口JwtEncoder

@FunctionalInterface
public interface JwtEncoder {
   Jwt encode(JoseHeader headers, JwtClaimsSet claims) throws JwtEncodingException;
}

JWT 的HeaderClaims也被相应地抽象为JoseHeaderJwtClaimsSet

于是我使用NimbusJwtEncoder进行了实现,其实是搬运了Spring Authorization Server的实现。当然也不是原版照搬,只是保证了门面一致,这样后续如果这个项目成熟了之后我们就可以无缝兼容了。

解析 JWT

既然有JwtEncoder必然有JwtDecoder。这个在Spring Security OAuth2 Client中是提供实现的,同样对其稍微加以改造。另外这个解码器不但负责将 JWT 字符串解析为 JWT 对象,它还承担了校验功能,这里有一个委托校验器DelegatingOAuth2TokenValidator,我们可以灵活定制来执行多个 JWT 校验策略。

Token 对

我们都知道通常 JWT 中的 Token 都是成对出现的。之前只是简单用一个类来封装了accessTokenrefreshToken的字符串形态。这次使用了spring ecurity oauth2 core提供的OAuth2AccessTokenResponse:

public final class OAuth2AccessTokenResponse {

   private OAuth2AccessToken accessToken;

   private OAuth2RefreshToken refreshToken;

   private Map<String, Object> additionalParameters;
}

这个类表达的内容更加丰富和灵活。对应的 json:

{
  "accessToken": {
    "tokenValue": "eyJraWQiOiJmZWxvcmRjbiIsInR5cCI6IkpXVCIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiJhbGwiLCJhdWQiOiJyb290IiwiaXNzIjoiaHR0cHM6XC9cL2ZlbG9yZC5jbiIsInNjb3BlcyI6WyJST0xFX0FETUlOIiwiUk9MRV9BUFAiXSwiZXhwIjoxNjE2ODM4NTg4LCJpYXQiOjE2MTY4MzQ5ODgsImp0aSI6IjBiYTUwZjFhLTI0N2YtNDJlYi05NzZiLTkyZWM5NDg2YjA2MCJ9.dwUK4ZgqhalKWu5AA8ZqaHjD2WPerhiF8lmybZGAorbncWdfVk7iAKUdRZunUekZmab_FsVpwprWIQpqSLtp6tz28sI71gO2StEeye5Vv4JRZKys68q2LGOAqMVJnBisEl211b5ASHSlP1qleU_TDxO_rgems76ZFD-kc1KmyelsoiBhmT3aD2_A_3fUmH7mV0jnC0rHauzOpS0AWnuPJaXbGPqrWotkQ_oqly47jipfNsPl_PUY1urng1wSx4QyblS8UgK-n5wJABhSN550WlwNLuC10ZckbhE5gazM0mD86mA_Xepe7LY5rjGNvO-Cz9k44TaURnTdSBdyy_EOiQ",
    "issuedAt": {
      "epochSecond": 1616834988,
      "nano": 891000000
    },
    "expiresAt": {
      "epochSecond": 1616838588,
      "nano": 891000000
    },
    "tokenType": {
      "value": "Bearer"
    },
    "scopes": [
      "ROLE_ADMIN",
      "ROLE_APP"
    ]
  },
  "refreshToken": {
    "tokenValue": "eyJraWQiOiJmZWxvcmRjbiIsInR5cCI6IkpXVCIsImFsZyI6IlJTMjU2In0.eyJzdWIiOiJhbGwiLCJhdWQiOiJyb290IiwiaXNzIjoiaHR0cHM6XC9cL2ZlbG9yZC5jbiIsInNjb3BlcyI6WyJST0xFX0FETUlOIiwiUk9MRV9BUFAiXSwiaWF0IjoxNjE2ODM0OTg4LCJqdhttps://www.3tt.net/?mod=artinfo&aid=326GkiOiI3N2RhODk3NC0xMjM0LTQ5NzctOWU1MS1hOGY2NTdjMzA2NjAifQ.O9YYxkevkrTke7GbK2R5LGphnJ9vd07yFSwPs2gEZ94ObPkIs1wJ5gvlNOIlni_BYMNO-nMB8TiX0w-RQSwo-sbVLqeUHqv6NEXXmPJiWVmXTFVJf2b6lqW5Re7clXGvkFMw14ptAF6cpThDEE5XF4eCI8CDKKPWqNxY-8NvokwIY3NMXB1ofuHHRqjMyVUwNjOv6eaTJFTwebPy6Saem9kvaL_X1v9Drok6azbg5DSP1zKnbVazTaOs4aBZd5Firib3r_BGXdaJWAgJKfpP61__muVdujgkppMVU8fC9pqfnb6IqEaAOIZ69lrezA1K0QFinOhgcC2YZFxFoLL-IQ",
    "issuedAt": {
      "epochSecond": 1616834988,
      "nano": 891000000
    },
    "expiresAt": null
  },
  "additionalParameters": {}
}
总结

其它大致没有改变多少,尽可能保证了原来的味道,又能够兼容 Spring Security 未来的风格。在代码迭代的过程中,如何能够同时做到兼容和灵活?关键就在于是否制定了统一的入口抽象和出口抽象。如果你能够做到这一点,你的代码质量就会明显的提高很多。我是:码农小胖哥,多多关注,分享更多日常开发中的心得体会。

  推荐站点

  • At-lib分类目录At-lib分类目录

    At-lib网站分类目录汇集全国所有高质量网站,是中国权威的中文网站分类目录,给站长提供免费网址目录提交收录和推荐最新最全的优秀网站大全是名站导航之家

    www.at-lib.cn
  • 中国链接目录中国链接目录

    中国链接目录简称链接目录,是收录优秀网站和淘宝网店的网站分类目录,为您提供优质的网址导航服务,也是网店进行收录推广,站长免费推广网站、加快百度收录、增加友情链接和网站外链的平台。

    www.cnlink.org
  • 35目录网35目录网

    35目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向35目录推荐、提交优秀网站。

    www.35mulu.com
  • 就要爱网站目录就要爱网站目录

    就要爱网站目录,按主题和类别列出网站。所有提交的网站都经过人工审查,确保质量和无垃圾邮件的结果。

    www.912219.com
  • 伍佰目录伍佰目录

    伍佰网站目录免费收录各类优秀网站,全力打造互动式网站目录,提供网站分类目录检索,关键字搜索功能。欢迎您向伍佰目录推荐、提交优秀网站。

    www.wbwb.net