2014-01-18 178 views
0

我試圖通過Java和Spring Social來寫信給某人的Twitter帳戶。春季安全Twitter訪問令牌

每當我通過我的Twitter應用程序請求寫訪問,我得到以下異常:

org.springframework.social.NotAuthorizedException: Invalid or expired token 
    org.springframework.social.twitter.api.impl.TwitterErrorHandler.handleClientErrors(TwitterErrorHandler.java:104) 
    org.springframework.social.twitter.api.impl.TwitterErrorHandler.handleError(TwitterErrorHandler.java:58) 
    org.springframework.web.client.RestTemplate.handleResponseError(RestTemplate.java:537) 

然而,當我關掉訪問,我沒有得到這個例外,但我(顯然)輸寫作的能力。從我所做的所有研究中,除了需要訪問令牌外,我還沒有能夠找到有關春季社交的任何信息。我無法找到Spring Social文檔,告訴我在哪裏獲得該文檔。

無論如何,這是在我的控制器:

@Autowired 
ConnectionRepository connectionRepository 

private Twitter getTwitter() { 
    connectionRepository.findPrimaryConnection(Twitter.class).api 
} 

@RequestMapping(value = "/connect/twitter/connect/twitter") 
String loggedIn(Model model) { 
    if (twitter?.authorized) { 
     model.addAttribute("screenName", twitter.userOperations().screenName) 
     twitter.timelineOperations().updateStatus("Welcome to Miami #helloWorld") 
     HOME 
    } 
    else { 
     "redirect:/twitter" 
    } 
} 

我ConnectionRepository實現是一個基本的MongoDB的。我不認爲這是問題,但如果是它幾乎是相同的: https://github.com/CarloMicieli/spring-social-mongo/blob/master/src/main/java/org/springframework/social/connect/mongo/MongoConnectionRepository.java

這裏是我的調度XML:

<bean class="org.springframework.social.connect.web.ConnectController"> 
    <property name="applicationUrl" value="http://localhost:8081/MinnesotaCows/" /> 
</bean> 
<bean class="org.springframework.social.connect.web.ProviderSignInController"> 
    <property name="applicationUrl" value="http://localhost:8081/MinnesotaCows/" /> 
    <property name="signUpUrl" value="/register" /> 
</bean> 
<bean id="twitterConnectionFactory" 
    class="org.springframework.social.twitter.connect.TwitterConnectionFactory"> 
    <constructor-arg value="bUC8VEWgkfkeTXuTBuxCg" /> 
    <constructor-arg value="5I1CNYKBCkNbsbgL2JfTNdSnSA9JVY4KHI4myxV7k4" /> 
</bean> 
<bean id="connectionFactoryLocator" 
    class="org.springframework.social.connect.support.ConnectionFactoryRegistry"> 
    <property name="connectionFactories"> 
     <list> 
      <ref bean="twitterConnectionFactory" /> 
     </list> 
    </property> 
</bean> 
<bean id="textEncryptor" class="org.springframework.security.crypto.encrypt.Encryptors" 
    factory-method="noOpText" /> 

注:我在本地主機上運行。這個問題可以解決嗎?既然沒有回調?另外,我沒有在ProviderSignInController中使用signUpUrl做任何事情。我不太確定這是什麼。

任何人對我可能會做錯什麼有任何想法 - 或者我如何通過API準確獲取訪問令牌?

謝謝你的時間!

回答

0

我還沒有測試過基於CarloMicieli的基於mongo的連接庫,但查看代碼,我可以看到主連接是第一個創建的連接。這與Spring Social中基於jdbc的內置存儲庫具有相同的行爲。但我認爲這是錯誤的,主連接應始終是提供者的最後一次發佈的連接/登錄(即使存在較新的連接,等級爲1的連接也可以過期)。

您可以嘗試清空mongo數據庫中的連接集合,然後測試代碼是否工作。如果令牌起作用,那麼這就是我描述的問題。

我已經創建了我自己的基於mongo的社交存儲庫,它們通過時間戳對連接進行排序並對它們進行排序,以便上次發佈的連接是主要連接。這樣你可以發出多次登錄,最後一次登錄將成爲主要連接。

從GitHub見參考文獻:https://github.com/trautonen/spring-social-mongodb/tree/master/src/main/java/org/eluder/spring/social/mongodb

您還定義了ConnectController其映射社會提供連接路徑。您可以通過請求POST來初始化登錄流程,如果完成時沒有問題,應該在MongoDB的連接集合中產生工作連接。

查看全文請參考:http://docs.spring.io/spring-social/docs/1.1.0.RELEASE/reference/htmlsingle/#creating-connections-with-connectcontroller