我目前正致力于在我的Android应用程序中集成Twitter。我在一定程度上成功地整合了它。但是我在以下场景中得到No authentication challenges found
例外。
App-only authentication
(无需登录Twitter)从twitter获取公共供稿。我成功取了它们。 注意:如果我不使用App-only authentication
并选择直接登录(不提取公共Feed),那么它可以正常工作,我可以登录。
以下是堆栈跟踪:
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和其他网站上的解决方案,但没有得到任何解决方案。
非常感谢任何帮助。
答案 0 :(得分: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
反过来给我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
答案 1 :(得分:0)
之后,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"));