还不会使用JWT格式化OAuth2令牌吗?

本文涉及的产品
密钥管理服务KMS,1000个密钥,100个凭据,1个月
简介: `OAuth2`默认的`AccessToken`是由`DefaultAccessTokenConverter`生成,是具有唯一性的`UUID`随机字符串,我们如果想要使用`JWT`来格式化`AccessToken`就需要使用`JwtAccessTokenConverter`来进行格式化,当然如果你有自己独特的业务可以自己实现`AccessTokenConverter`接口,并将实现类交付给`IOC`托管即可。

OAuth2默认的AccessToken是由DefaultAccessTokenConverter生成,是具有唯一性的UUID随机字符串,我们如果想要使用JWT来格式化AccessToken就需要使用JwtAccessTokenConverter来进行格式化,当然如果你有自己独特的业务可以自己实现AccessTokenConverter接口,并将实现类交付给IOC托管即可。

ApiBoot内部集成了DefaultAccessTokenConverter(默认)、JwtAccessTokenConverter,只需要一个配置就可以实现相互转换。

相关文档

JWT加密秘钥

JWT了解的同学应该知道,它内部不可逆的部分采用的是RSA加密,在加密过程中需要一个秘钥,在JwtAccessTokenConverter实现类中采用了6位随机字符串作为秘钥,相关源码如下:

/**
 * Helper that translates between JWT encoded token values and OAuth authentication
 * information (in both directions). Also acts as a {@link TokenEnhancer} when tokens are
 * granted.
 *
 * @see TokenEnhancer
 * @see AccessTokenConverter
 *
 * @author Dave Syer
 * @author Luke Taylor
 */
public class JwtAccessTokenConverter implements TokenEnhancer, AccessTokenConverter, InitializingBean {
  .....

    private String verifierKey = new RandomValueStringGenerator().generate();

    private Signer signer = new MacSigner(verifierKey);

    private String signingKey = verifierKey;
}  

这种形式虽然在某一些层面上是唯一的,实在感觉不太严谨,所以ApiBoot添加一个配置,可以自定义这个加密秘钥signingKey字段。

创建示例项目

为了本章的演示效果,我们使用IDEA来创建一个SpringBoot项目,pom.xml文件内相关的依赖如下所示:

<dependencies>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
  </dependency>
  <dependency>
    <groupId>org.minbox.framework</groupId>
    <artifactId>api-boot-starter-security-oauth-jwt</artifactId>
  </dependency>
</dependencies>
<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.minbox.framework</groupId>
      <artifactId>api-boot-dependencies</artifactId>
      <version>2.2.0.RELEASE</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

依赖添加完成后下面我们配置下测试的用户以及客户端信息

配置内存用户

我们在获取AccessToken时使用的password授权类型,所以我们需要在application.yml文件内配置登录用户所使用的用户名、密码,如下所示:

api:
  boot:
    security:
      users:
        - username: yuqiyu
          password: 123456
本章为了演示 JWT格式化 AccessToken,验证的用户采用内存方式配置, 了解详情

开启JWT转换

ApiBoot OAuth2默认使用DefaultAccessTokenConverter实现类来格式化AccessToken,如果我们想要切换到JwtAccessTokenConverter,需要在application.yml添加一个配置,如下所示:

api:
  boot:
    oauth:
      # 启用JWT,用于格式化AccessToken
      jwt:
        enable: true

配置加密秘钥

在本文开头说到了JwtAccessTokenConverter实现类内采用的是6位随机字符串的方式来作为RSA加密的秘钥,ApiBoot OAuth2提供了参数配置可以进行自定义,如下所示:

api:
  boot:
    oauth:
      jwt:
        # 加密秘钥
        sign-key: 恒宇少年
秘钥格式不限,如: 特殊字符串汉字数字字母....

运行测试

见证奇迹的时刻到了,我们通过IDEAXxxApplication方式来启动本章项目,尝试使用CURL方式获取AccessToken如下所示:

➜ ~ curl ApiBoot:ApiBootSecret@localhost:9090/oauth/token -d 'grant_type=password&username=yuqiyu&password=123456'
{
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiYXBpIl0sInVzZXJfbmFtZSI6Inl1cWl5dSIsInNjb3BlIjpbImFwaSJdLCJleHAiOjE1NzU5NTMwNDgsImF1dGhvcml0aWVzIjpbIlJPTEVfYXBpIl0sImp0aSI6ImQxMDNmNDYwLTk3YzMtNGNiZS05OWM4LWYzZjU2MmRhMDZhOCIsImNsaWVudF9pZCI6IkFwaUJvb3QifQ.HMHRBCIGPZNlkJPCnXaktMWxXEW-5roo7tdQR1JpCyY", 
    "token_type": "bearer", 
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiYXBpIl0sInVzZXJfbmFtZSI6Inl1cWl5dSIsInNjb3BlIjpbImFwaSJdLCJhdGkiOiJkMTAzZjQ2MC05N2MzLTRjYmUtOTljOC1mM2Y1NjJkYTA2YTgiLCJleHAiOjE1Nzg1Mzc4NDgsImF1dGhvcml0aWVzIjpbIlJPTEVfYXBpIl0sImp0aSI6ImY1NDMxZTMzLWE1YzMtNGVmNC1hZDM0LTk1MGQ3ODliYTRiZCIsImNsaWVudF9pZCI6IkFwaUJvb3QifQ.TfJ5vThvaibV2kVo2obHqnYzmYm-GsdtRLoB3RJbkrg", 
    "expires_in": 6925, 
    "scope": "api", 
    "jti": "d103f460-97c3-4cbe-99c8-f3f562da06a8"
}
ApiBoot OAuth有默认的客户端配置信息为 ApiBootApiBootSecret,为了方便演示,这里没做修改,如需修改请查看 ApiBoot OAuth文档,如果你感觉控制台打印的 json不美观,阅读性太差,可以使用 在线格式化JSON工具.

敲黑板,划重点

使用ApiBoot来格式化OAuth2AccessToken是不是特别简单?省去了我们自己去创建JwtAccessTokenConverter实例,然后还需要将实例放入IOC繁琐的步骤,更多使用详解敬请期待~~

代码示例

如果您喜欢本篇文章请为源码仓库点个Star,谢谢!!!
本篇文章示例源码可以通过以下途径获取,目录为apiboot-security-oauth-use-jwt

相关文章
|
6月前
|
存储 JSON 安全
JWT令牌详解
JWT令牌详解
186 3
|
3月前
|
安全 Java 数据安全/隐私保护
|
2月前
|
存储 JSON 算法
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)
文章介绍了JWT令牌的基础教程,包括其应用场景、组成部分、生成和校验方法,并在Springboot中使用JWT技术体系完成拦截器的实现。
126 0
JWT令牌基础教程 全方位带你剖析JWT令牌,在Springboot中使用JWT技术体系,完成拦截器的实现 Interceptor (后附源码)
|
7月前
|
JSON 安全 程序员
[JavaWeb]——JWT令牌技术,如何从获取JWT令牌
[JavaWeb]——JWT令牌技术,如何从获取JWT令牌
120 0
|
4月前
|
JSON Java API
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
【Azure Developer】如何验证 Azure AD的JWT Token (JSON Web 令牌)?
105 0
|
5月前
|
存储 JSON 安全
OAuth2与JWT在API安全中的角色:技术深度解析
【7月更文挑战第20天】OAuth2和JWT作为两种重要的安全协议,在API安全中发挥着不可或缺的作用。OAuth2通过提供灵活的授权框架,实现了对资源的细粒度访问控制;而JWT则通过其紧凑性和自包含性,确保了身份验证和信息传输的安全性。在实际应用中,将OAuth2和JWT结合使用,可以构建出既强大又安全的API服务,为用户提供更加安全、可靠和便捷的数字体验。
JWT令牌,JWT令牌的后续使用,在其他端口中使用的注意事项?如果你编写了JWT令牌的话,在下一次请求当中,都需要添加的,如果你已经配置好了WebConfig和Inter 就不用配了,添加了拦截器之后
JWT令牌,JWT令牌的后续使用,在其他端口中使用的注意事项?如果你编写了JWT令牌的话,在下一次请求当中,都需要添加的,如果你已经配置好了WebConfig和Inter 就不用配了,添加了拦截器之后
|
6月前
|
JSON 前端开发 数据格式
关于JWT令牌和过滤器以及拦截器的实现流程
JWT令牌用于验证用户请求合法性,登录时通过Filter或Interceptor校验账号密码,生成JWT并返回给前端保存。请求时,后端通过解析令牌检查其完整性、时效性和合法性。Filter在请求处理前检查是否携带JWT,Interceptor的preHandle方法同样用于此目的。两者选择其一即可,拦截器配置更精确但稍复杂。
|
7月前
|
存储 JSON 算法
SpringBoot之JWT令牌校验
SpringBoot之JWT令牌校验
|
7月前
|
JSON 前端开发 Java

热门文章

最新文章