Twitter4J + Android:身份验证挑战为空异常。

14
我正在使用Twitter4J库进行OAuth认证,但在打开Twitter登录页面之前就遇到了“Authentication Challenge is Null Exception”的问题。
以下是代码。
    Twitter twitter = new TwitterFactory().getInstance();
    try
    {

        twitter.setOAuthConsumer(Startup.TWITTER_KEY, Startup.TWITTER_SECRET);

        String callbackURL = "twitter-client:///";

        RequestToken rToken = twitter.getOAuthRequestToken(callbackURL);

        startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(rToken.getAuthenticationURL())));

    }
    catch(IllegalStateException e)
    {
    // access token is already available, or consumer key/secret is not set.
        if(!twitter.getAuthorization().isEnabled()){
            System.out.println("OAuth consumer key/secret is not set.");
            System.exit(-1);
        }
    }
    catch(Exception e)
    {
        Toast.makeText(Home.this, "Network Host not responding: "+e.getMessage(),Toast.LENGTH_SHORT).show();  //This exception. 
    }

异常:

E/Home (4393): 收到身份验证挑战为空 E/Home (4393): 收到身份验证挑战为null。相关讨论可以在以下网址找到:E/Home (4393): http://www.google.co.jp/search?q=6c607809或E/Home (4393): http://www.google.co.jp/search?q=0f1d8134 E/Home (4393): TwitterException{exceptionCode=[6c607809-0f1d8134 cab4c0ac-d492a113], statusCode=-1, retryAfter=0, rateLimitStatus=null, version=2.2.2} E/Home (4393): at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:204) E/Home (4393): at twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:65) E/Home (4393): at twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:102) E/Home (4393): at twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:108) E/Home (4393): at twitter4j.TwitterBaseImpl.getOAuthRequestToken(TwitterBaseImpl.java:271) E/Home (4393): at com.sharj.trafik.view.Home.askOAuth(Home.java:157) E/Home (4393): at com.sharj.trafik.view.Home.access$0(Home.java:143) E/Home (4393): at com.sharj.trafik.view.Home$3.onClick(Home.java:110) E/Home (4393): at android.view.View.performClick(View.java:2485) E/Home (4393): at android.view.View$PerformClick.run(View.java:9080) E/Home (4393): at android.os.Handler.handleCallback(Handler.java:587) E/Home (4393): at android.os.Handler.dispatchMessage(Handler.java:92) E/Home (4393): at android.os.Looper.loop(Looper.java:130) E/Home (4393): at android.app.ActivityThread.main(ActivityThread.java:3683) E/Home (4393): at java.lang.reflect.Method.invokeNative(Native Method) E/Home (4393): at java.lang.reflect.Method.invoke(Method.java:507) E/Home (4393): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) E/Home (4393): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) E/Home (4393): at dalvik.system.NativeStart.main(Native Method) E/Home (4393): 引起的原因: E/Home (4393): 接收到身份验证挑战为空的IOException E/Home (4393): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.processAuthHeader(HttpURLConnectionImpl.java:1153) E/Home (4393): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.processResponseHeaders(HttpURLConnectionImpl.java:1095) E/Home (4393): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.retrieveResponse(HttpURLConnectionImpl.java:1048) E/Home (4393): at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:726) E/Home (4393): at org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:121) E/Home (4393): at twitter4j.internal.http.HttpResponseImpl.(HttpResponseImpl.java:35) E/Home (4393): at twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:168) E/Home (4393): ... 18 more

它包含以下链接,但Google上没有太多相关信息。

http://www.google.co.jp/search?q=6c607809

http://www.google.co.jp/search?q=0f1d8134


完整的堆栈跟踪将会很有帮助。 - Femi
我遇到了同样的问题:你解决了吗?不是时间不正确的问题。 - Patrick Perini
不,我没有能够解决它,所以我暂时放弃了集成。很快会再试一次。 - Sharjeel
我有同样的问题。如何解决????我的日期时间和时区都是正确的。 - emeraldhieu
我遇到了这个问题,问题出在时间上。我的模拟器时间不正确。 - Bhavesh Hirpara
6个回答

15

我曾经遇到同样的问题。原来如果oAuth调用中的时间戳不正确,服务器会返回401状态错误,在Android设备上会导致抛出“接收到的认证挑战为空”的异常。所有出现此问题的设备时间都不正确,修复时间就能解决问题。

也许这也是你的问题所在?


1
oAuth协议的一部分涉及在每个命令中发送时间戳(这可能由您使用的类处理)。服务器将时间戳与其当前时间进行比较,如果不在某个窗口内(对于我使用的服务器而言为300秒),它将以401错误拒绝该命令。不幸的是,安卓不能优雅地处理401错误(在我看来这是一个bug),并抛出您看到的异常。如果您正确设置时间,问题将消失。(请注意,任何其他的oAuth错误也会生成401错误)。 - John Gaby
这个答案绝对需要更多的关注! - luben
http://stackoverflow.com/questions/20902350/android-twitter-received-authentication-challenge-is-null - nobalG
仍然面临同样的问题,请帮助我。 - Vaishali Sutariya

2
我也遇到了同样的问题。一开始我在执行getOAuthRequestToken()时就出现了这个问题。我的消费者密钥和消费者密钥来自于.properties文件,结果它们末尾有一个空格,所以被Twitter API视为无效。
之后,在执行getOAuthAccessToken()时,我也遇到了同样的401错误。这里,我没有正确地持久化和重新构建RequestToken对象。

你解决了这个问题吗? 我使用的是twitter4j-media-support-4.0.4 jar文件。 - Vaishali Sutariya

1
当我连续两次调用以下代码时,发生了这种情况:
 requestToken = twitter.getOAuthRequestToken();
    return requestToken.getAuthorizationURL();

我曾经遇到过同样的问题...这是因为用户第一次取消了oAUTH,然后第二次重新进入进行授权。我们使用了twitter.getSingleton“可重用”实例...跨调用...但这并不起作用。我们必须每次使用ConfigurationBuilder创建Twitter实例。 - lepert

0

0

已修复:即使我已经修复了日期和时间,但当我查看logcat中twittherj发送到服务器的参数时,时间戳仍然是错误的 - 因此我强制关闭了应用程序,之后异常消失了。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接