【问题标题】:No authentication challenges found while using twitter4j library使用 twitter4j 库时未发现身份验证挑战
【发布时间】:2013-11-27 14:43:33
【问题描述】:

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

  1. 我使用App-only authentication(不登录推特)从推特获取公共提要。我成功获取它们。
  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 和其他网站上搜索过解决方案,但没有找到。

非常感谢任何帮助。

【问题讨论】:

  • 你能写下你用于认证目的的代码吗
  • 贴出代码供参考。

标签: android authentication twitter twitter4j


【解决方案1】:

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

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

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

解决方案:

第 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,而这又会给我AccessTokenAccessTokenSecret

第 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                           

【讨论】:

  • 能否请您通过发送请求令牌正确代码以获取访问令牌和访问令牌秘密?
  • 嗨,Ritesh 我也必须执行相同的任务,但我无法转发。我已经让用户成功登录,获得了访问令牌、访问密钥以及承载令牌。
  • 我正在添加代码块作为回复而不是评论,因为它作为评论发布太长了。
【解决方案2】:

之后,twitter api 的 1.1 版身份验证对于所有 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"));

【讨论】:

    猜你喜欢
    • 2012-10-14
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2013-09-05
    • 2015-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多