为什么 OAuth2 客户端刷新没有过期 access_token?
Why isn't OAuth2 client refreshing expired access_token?
我有一个配置了 @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。现在,在 access_token 已过期的情况下,我的资源服务器(我认为是正确的)向客户端发送 HTTP 401 响应。
客户端仍然没有尝试刷新令牌。
也许我的心智模型是错误的。我希望客户端在 access_token 过期的情况下自动使用 refresh_token 获取新的。我不知道我是否认为它应该主动刷新 access_token (在到期时间之前的某个 epsilon 内),或者等待下游请求失败然后尝试刷新。但我的客户似乎两者都没有做,我也不知道为什么。
如本 git 问题所述:https://github.com/spring-guides/tut-spring-security-and-angular-js/issues/140,问题可能与以下事实有关:spring 1.4 及以上版本启动处理下游的 Zuul 过滤器访问令牌的服务 (org.springframework.cloud.security.oauth2.proxy.OAuth2TokenRelayFilter
) 缺少一个 OAuth2RestTemplate
类型的 bean,当访问令牌过期时,过滤器本身使用它来自动处理 refresh_token 授权。
我遇到了同样的问题,我通过在配置 class 中添加以下 bean 解决了这个问题:
@Configuration
public class ZuulConfiguration {
@Bean
protected OAuth2RestTemplate oauth2RestTemplate(OAuth2ProtectedResourceDetails resource,
OAuth2ClientContext context) {
return new OAuth2RestTemplate(resource, context);
}
}
我有一个配置了 @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。现在,在 access_token 已过期的情况下,我的资源服务器(我认为是正确的)向客户端发送 HTTP 401 响应。
客户端仍然没有尝试刷新令牌。
也许我的心智模型是错误的。我希望客户端在 access_token 过期的情况下自动使用 refresh_token 获取新的。我不知道我是否认为它应该主动刷新 access_token (在到期时间之前的某个 epsilon 内),或者等待下游请求失败然后尝试刷新。但我的客户似乎两者都没有做,我也不知道为什么。
如本 git 问题所述:https://github.com/spring-guides/tut-spring-security-and-angular-js/issues/140,问题可能与以下事实有关:spring 1.4 及以上版本启动处理下游的 Zuul 过滤器访问令牌的服务 (org.springframework.cloud.security.oauth2.proxy.OAuth2TokenRelayFilter
) 缺少一个 OAuth2RestTemplate
类型的 bean,当访问令牌过期时,过滤器本身使用它来自动处理 refresh_token 授权。
我遇到了同样的问题,我通过在配置 class 中添加以下 bean 解决了这个问题:
@Configuration
public class ZuulConfiguration {
@Bean
protected OAuth2RestTemplate oauth2RestTemplate(OAuth2ProtectedResourceDetails resource,
OAuth2ClientContext context) {
return new OAuth2RestTemplate(resource, context);
}
}