【发布时间】:2015-09-10 04:08:51
【问题描述】:
我有一个配置了@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 内),或者等待下游请求失败并尝试刷新。但我的客户似乎什么都没做,我不知道为什么不做。
【问题讨论】:
-
我可以看到
org.springframework.cloud.security.oauth2.resource.UserInfoTokenServices#getMap(在客户端)正在使用信息量较少的访问令牌设置(替换)上下文中的 access_token。替换令牌仅包含不透明字符串令牌值,而它正在替换的令牌包含过期和刷新令牌。还没有弄清楚为什么令牌被替换为包含相同的不透明字符串的不太完整的令牌。 -
嗨,这听起来正是我遇到的问题。我想授予短期访问令牌并让 zuul 代理在用户会话期间使用刷新令牌。你有任何进展吗?
-
@WillFaithfull 对不起,不,我从来没有想过这个问题,现在可能应该已经删除了这个问题。很抱歉对您没有帮助。
-
我确实得到了这个工作。我的 zuul 代理 SSO 应用程序中有两个问题 - 我需要
DefaultTokenServicesbean 来拥有tokenServices.setSupportRefreshToken(true),并且我需要在上下文中定义一个OAuth2RestOperationsbean 以便它可以实际发出请求。从那里开始的问题与我的授权服务器有关。我不确定这是否构成问题的答案,或者它是否甚至是同一个问题。