2

我目前正在将 Twitter 集成到我的 android 应用程序中。我在一定程度上成功地整合了它。但是,我No authentication challenges found在以下情况下遇到异常。

  1. 我使用App-only authentication(不登录 twitter)从 twitter 获取公共提要。我成功地获取它们。
  2. 当我尝试回复或转发或将其标记为收藏时,我会检查用户是否已登录,如果未登录,则我尝试先登录,然后再进行回复或转发。
  3. 但是我在尝试仅登录时遇到了上述异常,所以我没有回复或转发。

注意:如果我不使用App-only authentication并选择直接登录(不获取公共提要),那么它工作正常,我可以登录。

以下是堆栈跟踪:

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)

编辑:

以下是我用来根据用户是否登录来切换配置的代码。

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 和其他网站上搜索了解决方案,但没有得到任何解决方案。

非常感谢任何帮助。

4

2 回答 2

1

我做了几件事,终于找到了自己问题的答案。因此在这里发帖。

问题:未发现身份验证挑战

原因:登录后我没有发送AccessToken和配置。AccessTokenSecret因此,它没有获得身份验证数据。

解决方案 :

第 1 步:我使用App-only authentication(未登录 twitter)从 twitter 获取公共提要。我成功地获取它们。为此,我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,而这又会给我AccessTokenand 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                           
于 2013-11-29T09:31:43.627 回答
0

之后,所有 api 调用都必须使用 1.1 版的twitter 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"));
于 2013-11-16T11:17:18.533 回答