2013-11-14 3 views
2

В настоящее время я работаю над интеграцией Twitter в приложение для Android. Я успешно его интегрировал. Однако я получаю исключение No authentication challenges found в следующем сценарии.Нет проблем с проверкой подлинности при использовании библиотеки twitter4j

  1. Я использую App-only authentication (без входа в твиттер), чтобы получать публичные каналы из твиттера. Я получаю их успешно.
  2. Когда я пытаюсь ответить или отредактировать или отметить его как избранное, я проверяю, был ли пользователь уже зарегистрирован или нет, если он не вошел в систему, я сначала попытаюсь войти в систему, а затем выполнить ответ или отредактировать.
  3. Но я получаю вышеупомянутое исключение при попытке войти в систему, поэтому я не дойду до ответа или ретвита.

Примечание: Если я не использую App-only authentication и выбрать для входа непосредственно (не извлекая общественный канал), то он работает отлично, и я могу войти.

Ниже приводится StackTrace:

11-14 19:33:03.597: W/System.err(3305): No authentication challenges found 
11-14 19:33:03.667: W/System.err(3305): Relevant discussions can be found on the Internet at: 
11-14 19:33:03.667: W/System.err(3305):  http://www.google.co.jp/search?q=9ddbeb3a or 
11-14 19:33:03.727: W/System.err(3305):  http://www.google.co.jp/search?q=937eec8d 
11-14 19:33:03.747: W/System.err(3305): TwitterException{exceptionCode=[9ddbeb3a-937eec8d c8a7b39b-dc5ea0d9], statusCode=-1, message=null, code=-1, retryAfter=-1, rateLimitStatus=null, version=3.0.4} 
11-14 19:33:03.797: W/System.err(3305):  at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:177) 
11-14 19:33:03.857: W/System.err(3305):  at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:61) 
11-14 19:33:03.897: W/System.err(3305):  at twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:98) 
11-14 19:33:03.957: W/System.err(3305):  at twitter4j.auth.OAuthAuthorization.getOAuthAccessToken(OAuthAuthorization.java:145) 
11-14 19:33:04.097: W/System.err(3305):  at twitter4j.auth.OAuthAuthorization.getOAuthAccessToken(OAuthAuthorization.java:165) 
11-14 19:33:04.107: W/System.err(3305):  at twitter4j.TwitterBaseImpl.getOAuthAccessToken(TwitterBaseImpl.java:381) 

EDIT:

Ниже приводится код, я использую для переключения конфигурации на основе того, зарегистрирован пользователь или нет.

private TwitterInstance(boolean withLoginConfig) { 

     ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); 
     configurationBuilder 
       .setOAuthConsumerKey(STAConstants.TWITTER_CONSUMER_KEY); 
     configurationBuilder 
       .setOAuthConsumerSecret(STAConstants.TWITTER_CONSUMER_SECRET); 
     // configuration required to fetch feeds without login. 
     if (!withLoginConfig) { 
      configurationBuilder.setUseSSL(true); 
      // IMPORTANT: set T4J to use App-only authentication 
      configurationBuilder.setApplicationOnlyAuthEnabled(true); 
      configurationBuilder.setOAuth2TokenType(getOAuth2Token() 
        .getTokenType()); 
      configurationBuilder.setOAuth2AccessToken(getOAuth2Token() 
        .getAccessToken()); 
     } 
     Configuration configuration = configurationBuilder.build(); 
     twitterFactory = new TwitterFactory(configuration); 
     twitter = twitterFactory.getInstance(); 
     requestToken = null; 
    } 

Я искал решение на SO и других сайтах, но не получил.

Любая помощь очень ценится.

+0

Вы можете написать код, который вы используете для целей аутентификации. – Jhanvi

+0

опубликовал код для справки. –

ответ

1

Я работал над несколькими вещами и, наконец, нашел ответ на свой вопрос. Поэтому отправляйте сюда.

Выпуск: Нет аутентификации проблемы не найдено

Причина: Я не посылал AccessToken и AccessTokenSecret в конфигурации после авторизации. Следовательно, он не получал данные аутентификации.

Решение:

Шаг 1: Я использую App-only authentication (без Loging в твиттер), чтобы принести общественности каналов из твиттера. Я получаю их успешно.Для этого я использую BearerToken в конфигурации следующим образом:

ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); 
    configurationBuilder.setOAuthConsumerKey(Constants.TWITTER_CONSUMER_KEY); 
    configurationBuilder.setOAuthConsumerSecret(Constants.TWITTER_CONSUMER_SECRET); 
    configurationBuilder.setUseSSL(true); 
    // IMPORTANT: set T4J to use App-only authentication 
    configurationBuilder.setApplicationOnlyAuthEnabled(true); 
    configurationBuilder.setOAuth2TokenType(getOAuth2Token().getTokenType()); 
    configurationBuilder.setOAuth2AccessToken(getOAuth2Token().getAccessToken()); 

Шаг 2: Когда я пытаюсь ответить или ретвит или пометить его как любимого, я проверяю, если пользователь уже вошел в систему или нет, если это не вошел в систему, я сначала попытаюсь войти в систему, а затем сделаю ответ или ретвит. Для этого я использую следующую конфигурацию.

ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); 
configurationBuilder.setOAuthConsumerKey(Constants.TWITTER_CONSUMER_KEY); 
configurationBuilder.setOAuthConsumerSecret(Constants.TWITTER_CONSUMER_SECRET); 

Это даст мне RequestToken, который в свою очередь, даст мне AccessToken и AccessTokenSecret.

Шаг 3: После этого я буду использовать следующую конфигурацию для последующих запросов без каких-либо проблем.

ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); 
configurationBuilder.setOAuthConsumerKey(Constants.TWITTER_CONSUMER_KEY); 
configurationBuilder.setOAuthConsumerSecret(Constants.TWITTER_CONSUMER_SECRET); 
configurationBuilder.setOAuthAccessToken(getAccessToken()); // from sharedPreferences 
configurationBuilder.setOAuthAccessTokenSecret(getAccessTokenSecret()); // from sharedPreferences       
+0

не могли бы вы получить правильный код, чтобы получить токен доступа и получить доступ к токену, отправив маркер запроса? –

+0

Hi Ritesh Мне тоже нужно выполнить одно и то же задание, но я не могу отредактировать. Я успешно зарегистрировал пользователя, получил доступ к токену, доступ к тайне, а также токен. – seema

+0

Я добавляю код как ответ вместо комментария, поскольку он слишком длинный для публикации в качестве комментария. – seema

0

После, версий 1.1 twitter api аутентификации является обязательным для всех вызовов API, даже для извлечения общественных твиты и поиска .. Таким образом, вы должны добавить учетные данные силой:

AccessToken accessToken = new AccessToken("ACCESS_TOKEN","TOKEN_SECRET"); 
twitter.setOAuthAccessToken(accessToken); 

Полного код может быть, как следует:

 ConfigurationBuilder configurationBuilder = new ConfigurationBuilder(); 
     configurationBuilder 
       .setOAuthConsumerKey(STAConstants.TWITTER_CONSUMER_KEY); 
     configurationBuilder 
       .setOAuthConsumerSecret(STAConstants.TWITTER_CONSUMER_SECRET); 
     Configuration configuration = configurationBuilder.build(); 
     TwitterFactory twitterFactory = new TwitterFactory(configuration); 
     Twitter twitter = twitterFactory.getInstance(); 
     AccessToken accessToken = new AccessToken("ACCESS_TOKEN","TOKEN_SECRET"); 
     twitter.setOAuthAccessToken(accessToken); 
     System.out.println(twitter.getUserTimeline("twitter")); 
+0

thnx для вашего ответа. –

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