2014-01-18 2 views
0

Я пытаюсь получить возможность писать чей-то аккаунт Twitter через Java и Spring Social.Spring Security Twitter Access Token

Всякий раз, когда я запросить доступ на запись через мое приложение на твиттере, я получаю следующее исключение:

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) 

Однако, когда я выключаю доступ, я не получаю это исключение, но я (очевидно) теряю способность писать. Из всех проведенных мной исследований я еще не смог найти ничего о весеннем социальном, за исключением того, что мне нужен токен доступа. Я не могу найти весеннюю социальную документацию, которая говорит мне, где это получить.

Во всяком случае, это в моем контроллере:

@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" /> 

Примечания: Я бег на локальном хосте. Может ли проблема быть такой? Так как нет обратного вызова? Кроме того, я не использую signUpUrl в ProviderSignInController для чего-либо. Я не совсем уверен, что это такое.

У кого-нибудь есть идеи о том, что я могу делать неправильно - или как я могу точно получить токен доступа через API?

Спасибо за ваше время!

ответ

0

Я не тестировал репозитории подключения на основе mongo на основе mongo CarloMicieli, но, глядя на код, я вижу, что первичное соединение - это первое созданное соединение. Это то же поведение, что и встроенный репозиторий на основе jdbc в Spring Social. Но я думаю, что это неправильно, первичное соединение должно быть всегда последним выпущенным соединением/логином для провайдера (соединение с рангом 1 может быть истекло, хотя есть более новые соединения).

Вы можете попытаться очистить коллекцию соединений в своем mongo db и проверить, работает ли ваш код после этого. Если же токен работает, это проблема, которую я описал.

Я создал свои собственные социальные хранилища на основе mongo, которые ранжируют соединения по метке времени и заказывают их так, чтобы последнее выпущенное соединение было основным. Таким образом, вы можете выпустить несколько логинов, и последний вход будет основным подключением.

Посмотреть таблицу из GitHub: https://github.com/trautonen/spring-social-mongodb/tree/master/src/main/java/org/eluder/spring/social/mongodb

Вы также определена ConnectController, отображающий путь подключения социального провайдера. Вы можете инициализировать входной поток, выполнив POST запрос /connect/twitter и, если он будет завершен без проблем, должно получиться рабочее соединение в вашей коллекции соединений в mongodb.

См. Полную ссылку здесь: http://docs.spring.io/spring-social/docs/1.1.0.RELEASE/reference/htmlsingle/#creating-connections-with-connectcontroller

Смежные вопросы