我试图在很长一段时间内找到解决方案并且没有找到任何有用的东西。 现在,直接问题。
我必须使用远程OAuth2身份验证服务器,并且我有使用它的凭据。身份验证用于REST服务调用。 REST服务在15分钟内被调用,我们的应用程序在一次迭代中调用多个URL。
第一次调用REST API,一切都很好,我们获得访问令牌,它很有用。 1小时后,当访问令牌过期并再次调用REST API时,我们会收到以下错误:
The access token provided has expired
此错误有时会显示一次,有时会显示两次或更多次。 再过15分钟后,REST API调用再次无错误。
我尝试使用属性retryBadAccessTokens
,但没有运气。
我们正在使用spring-security-oauth2-2.0.8.RELEASE
以下设置:
<bean id="oipRestTemplate" class="org.springframework.security.oauth2.client.OAuth2RestTemplate" scope="prototype">
<constructor-arg ref="oipClientCredentialsResourceDetail"/>
<property name="accessTokenProvider" ref="tokenProvider"/>
<property name="requestFactory" ref="httpComponentsClientHttpRequestFactory"/>
<property name="retryBadAccessTokens" value="true"/>
<property name="messageConverters">
<list>
<bean class="org.springframework.http.converter.StringHttpMessageConverter"/>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter" >
<property name="supportedMediaTypes">
<list>
<bean class="org.springframework.http.MediaType">
<constructor-arg value="application" />
<constructor-arg value="json" />
</bean>
</list>
</property>
</bean>
</list>
</property>
<property name="errorHandler">
<bean class="our.company.app.holders.MyResponseErrorHandler" />
</property>
</bean>
答案 0 :(得分:0)
看看他们是否也给你刷新令牌。您可以使用它们代表用户生成令牌。
顺便说一句,如果你每15分钟拨打一次,我每次都会得到新的令牌。当你每分钟拨打数千个电话时,你不想这样做......但是15分钟?不是很大。
答案 1 :(得分:0)
我们有一个相当高的流量系统,我要指出的是,我们获得的失败总是在令牌即将到期的那一刻左右发生。 客户端是否有可能查看即将过期的令牌,然后将其发送到服务器,现在令牌已过期,服务器拒绝它。
如果是这种情况,我们将需要一些缓冲区空间,其间隔至少应为Oauth2RestTemplate查看令牌副本与服务器查看令牌之间的时间差。
答案 2 :(得分:0)
我正在考虑将mod发布到Oauth2RestTemplate本身。
if (accessToken == null || accessToken.isExpired())
应该
if (accessToken == null || accessToken.isAboutToExpire())
带有一些声明值的配置值。