2014-01-18 269 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