OAuth2RestTemplate提供的访问令牌已过期

OAuth2RestTemplate提供的访问令牌已过期,rest,oauth-2.0,spring-security-oauth2,Rest,Oauth 2.0,Spring Security Oauth2,很长一段时间以来,我一直在寻找解决方案,但没有发现任何有用的东西。 现在,直奔问题 我必须使用远程OAuth2身份验证服务器,并且我有使用它的凭据。身份验证用于REST服务调用。 REST服务每隔15分钟调用一次,我们的应用程序在一次迭代中调用多个URL 第一次调用RESTAPI时,一切正常,我们得到了访问令牌,这很有用。 1小时后,当访问令牌过期并且再次调用REST API时,我们得到以下错误: The access token provided has expired 此错误有时显示一次,

很长一段时间以来,我一直在寻找解决方案,但没有发现任何有用的东西。 现在,直奔问题

我必须使用远程OAuth2身份验证服务器,并且我有使用它的凭据。身份验证用于REST服务调用。 REST服务每隔15分钟调用一次,我们的应用程序在一次迭代中调用多个URL

第一次调用RESTAPI时,一切正常,我们得到了访问令牌,这很有用。 1小时后,当访问令牌过期并且再次调用REST API时,我们得到以下错误:

The access token provided has expired
此错误有时显示一次,有时显示两次或更多。 再过15分钟,REST API调用再次无错误

我尝试使用property
retryBadAccessTokens
,但没有成功。 我们正在使用
spring-security-oauth2-2.0.8。使用以下设置发布

<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>

查看他们是否也在给您一个刷新令牌。您可以使用这些来代表用户生成令牌


顺便说一下,如果你每15分钟打一次电话,我每次都会收到新的代币。当你每分钟打数千个电话时,你不想这样做。。。。但是15分钟?没什么大不了的。

我们有一个相当高的流量系统,我注意到我们遇到的故障总是发生在代币即将到期的时刻。 客户端是否可能查看即将过期的令牌并将其发送到服务器,而现在该令牌已过期,服务器会拒绝该令牌


如果是这种情况,我们需要一些缓冲区空间,至少是Oauth2RestTemplate查看其令牌副本和服务器查看令牌之间的时间差。

我正在考虑向Oauth2RestTemplate本身发布一个mod

if (accessToken == null || accessToken.isExpired())
应该是

if(accessToken==null | | accessToken.isbaoutToExpire())


在OAuth2Request上的响应:'{“token\u type”:“Bearer”,“access\u token”:“very\u long\u token”,“expires\u in”:1250}是的,您没有得到刷新令牌。就像我说的,如果你每15分钟打一次电话,就换一个新的。相信我,伤害服务器是不可能的。现在好像没事了。每次迭代开始时,我通过
oiprestemplate.getOAuth2ClientContext().setAccessToken(null)从OAuth2ClientContext中删除访问令牌这是如何回答问题的?关键是Oauth2RestTemplate将自动刷新令牌本身。但是,它确实有一个小的故障窗口。如果在令牌到期之前调用它,它将无法刷新它,并且它可能在到达服务器时过期。我稍微对它进行了黑客攻击,这样它就可以存储令牌的本地副本,过期时间缩短了一分钟,从那以后我就再也没有过期令牌的问题了。