2016-01-06 108 views
0

我試圖找到解決方案很長一段時間,但沒有找到任何有用的東西。 現在,直接問題。OAuth2RestTemplate提供的訪問令牌已過期

我必須使用遠程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

看看他們是否也給你一個刷新令牌。您可以使用這些代表用戶來生成令牌。順便說一句,如果你每15分鐘打一次電話,我每次都會得到新的令牌。當您每分鐘撥打數千個電話時,您不想這麼做......但是15分鐘?不大。在OAuth2Request

+0

響應:「{ 」token_type「: 」承載「 」的access_token「: 」very_long_token「, 」expires_in「:1250 }」 – Worsik

+0

呀,你是不是給一個刷新令牌。就像我說的,如果你每15分鐘撥打一次電話,只需要一個新電話。相信我,它不會傷害服務器。 –

+2

現在看起來好了。在每次迭代開始時,我通過'oipRestTemplate.getOAuth2ClientContext()。從OAuth2ClientContext中刪除訪問令牌。setAccessToken(null);' – Worsik