为什么OAuth2客户端没有刷新过期的access_token?

时间:2015-06-24 05:36:22

标签: spring-security-oauth2

我的客户端应用配置了@EnableOAuth2Sso@EnableZuulProxy,资源服务器(单独的应用)配置了@EnableOAuth2Resource。我可以看到客户端使用Authorization: Bearer {access_token here}正确地向资源服务器进行身份验证,但是一旦访问令牌过期,代理资源服务器请求将永久失败。

[被修改]

我通过提供一个自定义RemoteTokenServices bean来修改我的资源服务器,该bean使用OpenAM的/ tokeninfo端点来决定access_token是否仍然有效。 (Spring提供的RemoteTokenServices bean尝试POST,从OpenAM获得405)。当我检测到access_token无效时,我从my.spring.oauth2.OpenAMRemoteTokenServices#loadAuthentication抛出InvalidTokenException。现在,我的资源服务器(我认为正确)在客户端响应时发送HTTP 401,如果access_token已过期。

但是,客户端并未尝试刷新令牌。

也许我的心理模型错了。我希望客户端在过期的access_token的情况下自动使用refresh_token来获取新的。我不知道我是否认为它应该主动刷新access_token(在到期时间之前的某个epsilon内),或者等待下游请求失败并尝试刷新。但是我的客户似乎都没做,我不能告诉你原因。

1 个答案:

答案 0 :(得分:2)

如此git问题中所述:https://github.com/spring-guides/tut-spring-security-and-angular-js/issues/140,问题可能与以下事实有关:使用Spring 1.4版及更高版本启动Zuul过滤器,该过滤器处理对服务的访问令牌的下游({{1} })缺少类型为org.springframework.cloud.security.oauth2.proxy.OAuth2TokenRelayFilter的bean,当访问令牌过期时,过滤器本身会使用该bean自动处理refresh_token授权。

我有同样的问题,我通过在配置类中添加以下bean来解决它:

OAuth2RestTemplate
相关问题