美文网首页ApiBoot 核心技术Spring Boot 核心技术
还不会使用JWT格式化OAuth2令牌吗?

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

作者: 恒宇少年 | 来源:发表于2019-12-11 09:16 被阅读0次

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

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

    博客原文地址:https://blog.yuqiyu.com/apiboot-security-oauth-use-jwt.html

    相关文档

    ApiBoot Security OAuth组件系列文章

    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

    签到送书活动进行中

    自律改变人生,恒宇少年回馈粉丝,给大家的福利,请访问https://blog.yuqiyu.com/welfare/了解详情。

    作者个人 博客
    使用开源框架 ApiBoot 助你成为Api接口服务架构师

    相关文章

      网友评论

        本文标题:还不会使用JWT格式化OAuth2令牌吗?

        本文链接:https://www.haomeiwen.com/subject/dbtogctx.html