SpringBoot+SpringSecurity+SpringCloudOauth2密码模式使用+RefreshToken(四)

Oauth2中的RefreshToken介绍

  1. refresh token是用于获取access token的凭据。refreshtoken由授权服务器颁发给client,用于在当前访问令牌变为无效或过期时获取新的访问令牌,或者获取具有相同或更窄范围的其他访问令牌(访问令牌可能具有更短的生命周期和权限少于资源所有者授权的权限。根据授权服务器的判断,发出刷新令牌是可选的。如果授权服务器发出刷新令牌,则在发出访问令牌时包括它
  2. 刷新令牌是表示资源所有者授予客户端的权限的字符串。该字符串通常对客户端不透明。令牌表示用于检索授权信息的标识符。与访问令牌不同,刷新令牌仅用于授权服务器,不会发送到资源服务器。
  +--------+                                           +---------------+
  |        |--(A)------- Authorization Grant --------->|               |
  |        |                                           |               |
  |        |<-(B)----------- Access Token -------------|               |
  |        |               & Refresh Token             |               |
  |        |                                           |               |
  |        |                            +----------+   |               |
  |        |--(C)---- Access Token ---->|          |   |               |
  |        |                            |          |   |               |
  |        |<-(D)- Protected Resource --| Resource |   | Authorization |
  | Client |                            |  Server  |   |     Server    |
  |        |--(E)---- Access Token ---->|          |   |               |
  |        |                            |          |   |               |
  |        |<-(F)- Invalid Token Error -|          |   |               |
  |        |                            +----------+   |               |
  |        |                                           |               |
  |        |--(G)----------- Refresh Token ----------->|               |
  |        |                                           |               |
  |        |<-(H)----------- Access Token -------------|               |
  +--------+           & Optional Refresh Token        +---------------+

               

所示的流程包括以下步骤:

  • (A)客户端通过向授权服务器进行认证、发起权限授予来获取access token。
  • (B)授权服务器验证客户端并验证权限授予授权,如果有效,则颁发访问令牌和刷新令牌。
  • (C)客户端通过呈现访问令牌向资源服务器发出受保护的资源请求。 (D)资源服务器验证访问令牌,如果有效,则为请求提供服务。
  • (E)重复步骤(C)和(D)直到访问令牌到期。如果客户端知道访问令牌已过期,则跳到步骤(G);否则,它会生成另一个受保护的资源请求
  • (F)由于访问令牌无效,资源服务器返回无效的令牌错误。
  • (G)客户端通过向授权服务器进行身份验证并显示刷新令牌来请求新的访问令牌。该客户端身份验证的要求是基于客户端类型和授权服务器策略。
  • (H)授权服务器验证客户端并验证刷新令牌,如果有效,则发出新的访问令牌(以及可选的新刷新令牌)。

RefreshToken使用

本篇文章还是使用的密码模式来使用,和前三章的代码有关系,有疑问可以查看SpringBoot+SpringSecurity+SpringCloudOauth2密码模式使用(三)整合JWT格式的Token,在授权服务的配置类中增加如下代码

@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Lazy
    @Autowired
    private PasswordEncoder passwordEncoder;

    @Autowired
    private AuthenticationManager authenticationManager;
    @Lazy
    @Autowired
    private JwtAccessTokenConverter jwtAccessTokenConverter;

    @Lazy
    @Autowired
    private UserService userService;

    @Lazy
    @Autowired
    private TokenStore jwtTokenStore;


    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        // 设置相关
        endpoints.authenticationManager(authenticationManager)
                .userDetailsService(userService)
                .tokenStore(jwtTokenStore)
                .accessTokenConverter(jwtAccessTokenConverter)
    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.inMemory()
                // 授权服务的名字
                .withClient("clients")
                // 授权码
                .secret(passwordEncoder.encode("112233"))
                // 重定向位置
                .redirectUris("http://www.baidu.com")
                // 授权范围
                .scopes("all")
                // access_token 失效时间(秒)
                .accessTokenValiditySeconds(60)
                // 刷新令牌失效时间(秒)
                .refreshTokenValiditySeconds(86400)
                /**
                 * authorization_code 授权码模式
                 * password 密码模式
                 * refresh_token 刷新token
                 *
                 */
                .authorizedGrantTypes("authorization_code","password","refresh_token");
    }
}

启动项目

这里也是用postMan来测试代码,accessTokenValiditySeconds(60)这一代码使得access_token在60秒之后过期,在60秒之后这一token就无法去使用了,之后就可以通过refresh_token来获取新的access_token,如图有两个token:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbImFsbCJdLCJleHAiOjE2MjMyNDExMDksInN5cyI6InpwaiIsImF1dGhvcml0aWVzIjpbImFkbWluIl0sImp0aSI6ImE2YzI2YTMxLTFkMDEtNDA0Yy1iYzhmLWUyY2U5ZWM1ODg4ZSIsImNsaWVudF9pZCI6ImNsaWVudHMifQ.ezHF3XsuJUyL4O88BYf5S9ivssbb6RaBJcQ6pBsniD8
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbImFsbCJdLCJhdGkiOiJhNmMyNmEzMS0xZDAxLTQwNGMtYmM4Zi1lMmNlOWVjNTg4OGUiLCJleHAiOjE2MjMzMjc0NDksInN5cyI6InpwaiIsImF1dGhvcml0aWVzIjpbImFkbWluIl0sImp0aSI6ImJiMjIzODIyLWE0YzEtNGY2My1iNDljLWViNzVmMTQxZDkxYSIsImNsaWVudF9pZCI6ImNsaWVudHMifQ.EElv0th8VZU-h8hXiMVWL8nMJmt_n7JHNpeLhVrdm4o

在这里插入图片描述

在Jwt官网上可以看到access_token的过期时间是什么时候

在这里插入图片描述

通过refresh_token来获取到新的access_token,参数如下

参数名参数值
grant_typerefresh_token
refresh_tokeneyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbImFsbCJdLCJhdGkiOiJhNmMyNmEzMS0xZDAxLTQwNGMtYmM4Zi1lMmNlOWVjNTg4OGUiLCJleHAiOjE2MjMzMjc0NDksInN5cyI6InpwaiIsImF1dGhvcml0aWVzIjpbImFkbWluIl0sImp0aSI6ImJiMjIzODIyLWE0YzEtNGY2My1iNDljLWViNzVmMTQxZDkxYSIsImNsaWVudF9pZCI6ImNsaWVudHMifQ.EElv0th8VZU-h8hXiMVWL8nMJmt_n7JHNpeLhVrdm4o

在这里插入图片描述

这样就获取到了新的access_token

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX25hbWUiOiJhZG1pbiIsInNjb3BlIjpbImFsbCJdLCJleHAiOjE2MjMyNDE0NTAsInN5cyI6InpwaiIsImF1dGhvcml0aWVzIjpbImFkbWluIl0sImp0aSI6IjM4YTBlMjY3LTJjNTAtNDI2NC1iMzA3LWI4NTg4YjllOTNmNSIsImNsaWVudF9pZCI6ImNsaWVudHMifQ.4L0paR45O4Me2FmrEKN4WMK28Y-xWl4nZVHWiAovMAY

在这里插入图片描述

新的access_token,新的过期时间

在这里插入图片描述


版权声明:本文为weixin_43947145原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。