【问题标题】:oauth2 auto refresh tokenoauth2 自动刷新令牌
【发布时间】:2018-07-26 12:06:06
【问题描述】:
我有一个 spring boot 控制器,它调用 wso2 上的服务。 (发送身份并接收令牌以进行进一步通信)。我正在寻找一种在 spring boot 端自动刷新令牌的方法(因为 wso2 上的服务调用不是由浏览器完成的,而是由另一个服务完成的)。
那么,在 Spring Boot 方面,我该如何实现呢?我知道我应该检查 access_token 的到期日期并使用 refresh_token 接收新的 access_token,但是是否有一些库可以做到这一点,或者我必须自己编写这个逻辑?另外,当在多个 Spring Boot 实例上运行我的应用程序时,如何防止令牌从一个实例刷新并使另一个实例上的令牌无效,使用相同的令牌?
【问题讨论】:
标签:
oauth-2.0
wso2
refresh-token
【解决方案1】:
OAuth2 为获取访问令牌提供了五种授权。其中之一是刷新令牌授权,用于在客户端已获得访问权限且令牌已过期后获取新的访问令牌。在刷新令牌授权中,客户端使用以下参数向授权服务器发送POST 请求:
grant_type=refresh_token&client_id=your_client_id&client_secret=your_client_secret
&refresh_token=your_refresh_token_from_the_first_grant
第一次获取令牌时,auth url 应该相同。对于自动刷新令牌,您可以在访问资源服务器时捕获HttpClientErrorException,并检查状态码是否为HttpStatus.UNAUTHORIZED。如果是,则发送新令牌请求。
try {
response = getRestTemplate().exchange...
} catch (HttpClientErrorException e) {
if (e.getStatusCode().equals(HttpStatus.UNAUTHORIZED))
//code to refresh the token or throw custom exception...
}catch (Exception e) {
//
}
对于客户端的多个实例,这可能会对您有所帮助:Spring Oauth2 - multiple tokens per client id
我还没有验证它,但本质上它使用 post 参数中的范围为相同的 client_id 生成不同的令牌。