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

Posted

技术标签:

【中文标题】Twitter4J + Android:身份验证挑战为空异常【英文标题】:Twitter4J + Android: Authentication Challenge is Null Exception 【发布时间】:2011-09-02 00:38:39 【问题描述】:

我正在使用 Twitter4J 库进行 OAuth 身份验证,但在它打开 Twitter 登录页面之前我收到“身份验证挑战为空异常”。

这是代码。

    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): 收到 身份验证质询为空 电子/家庭(4393):收到 身份验证挑战是 null相关讨论可以在 互联网地址:E/Home (4393): http://www.google.co.jp/search?q=6c607809 或电子/家庭(4393): http://www.google.co.jp/search?q=0f1d8134 电子/家庭(4393): TwitterExceptionexceptionCode=[6c607809-0f1d8134 cab4c0ac-d492a113],状态码=-1, retryAfter=0, rateLimitStatus=null, 版本=2.2.2 E/Home(4393):在 twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:204) 电子/家庭(4393):在 twitter4j.internal.http.HttpClientWrapper.request(HttpClientWrapper.java:65) 电子/家庭(4393):在 twitter4j.internal.http.HttpClientWrapper.post(HttpClientWrapper.java:102) 电子/家庭(4393):在 twitter4j.auth.OAuthAuthorization.getOAuthRequestToken(OAuthAuthorization.java:108) 电子/家庭(4393):在 twitter4j.TwitterBaseImpl.getOAuthRequestToken(TwitterBaseImpl.java:271) 电子/家庭(4393):在 com.sharj.trafik.view.Home.askOAuth(Home.java:157) 电子/家庭(4393):在 com.sharj.trafik.view.Home.access$0(Home.java:143) 电子/家庭(4393):在 com.sharj.trafik.view.Home$3.onClick(Home.java:110) 电子/家庭(4393):在 android.view.View.performClick(View.java:2485) 电子/家庭(4393):在 android.view.View$PerformClick.run(View.java:9080) 电子/家庭(4393):在 android.os.Handler.handleCallback(Handler.java:587) 电子/家庭(4393):在 android.os.Handler.dispatchMessage(Handler.java:92) 电子/家庭(4393):在 android.os.Looper.loop(Looper.java:130) 电子/家庭(4393):在 android.app.ActivityThread.main(ActivityThread.java:3683) 电子/家庭(4393):在 java.lang.reflect.Method.invokeNative(Native 方法)电子/家庭(4393):在 java.lang.reflect.Method.invoke(Method.java:507) 电子/家庭(4393):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 电子/家庭(4393):在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 电子/家庭(4393):在 dalvik.system.NativeStart.main(Native 方法)电子/家庭(4393):引起: java.io.IOException:收到 身份验证质询为空 电子/家庭(4393):在 org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.processAuthHeader(HttpURLConnectionImpl.java:1153) 电子/家庭(4393):在 org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.processResponseHeaders(HttpURLConnectionImpl.java:1095) 电子/家庭(4393):在 org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.retrieveResponse(HttpURLConnectionImpl.java:1048) 电子/家庭(4393):在 org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:726) 电子/家庭(4393):在 org.apache.harmony.luni.internal.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:121) 电子/家庭(4393):在 twitter4j.internal.http.HttpResponseImpl.(HttpResponseImpl.java:35) 电子/家庭(4393):在 twitter4j.internal.http.HttpClientImpl.request(HttpClientImpl.java:168) 电子/家庭(4393):... 18 更多

它包含以下链接,但谷歌对此没有太多了解。

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

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

【问题讨论】:

完整的堆栈跟踪会很有帮助。 我遇到了同样的问题:你有没有解决这个问题?错误的时间对我没有用。 不,我无法解决它,所以我暂时放弃了集成。很快会再试一次。 我也有同样的问题。怎么解决????我的日期时间和时区是正确的。 我遇到了这个问题,问题是时间。我的模拟器时间不对 【参考方案1】:

我遇到了同样的问题。事实证明,如果 oAuth 调用上的时间戳不正确,服务器会返回 401 状态错误,这在 Android 设备上会导致抛出“Received authentication challenge is null”异常。出现此问题的所有设备的时间都不正确,修复时间即可解决问题。

也许这也是你的问题?

【讨论】:

oAuth 协议的一部分涉及为每个命令发送时间戳(这可能由您正在使用的类处理)。那里的服务器将时间戳与其当前时间进行比较,如果它不在某个窗口内(对于我正在使用的服务器,它是 300 秒),它将拒绝该命令并返回 401 错误。不幸的是,Android 没有优雅地处理 401 错误(恕我直言,这是一个错误),并引发了您所看到的异常。如果您正确设置时间,问题就会消失。 (请注意,任何其他 oAuth 错误也会产生 401 错误)。 这个答案肯定需要更多可见性! ***.com/questions/20902350/… 仍然面临同样的问题,请帮助我【参考方案2】:

我也遇到了同样的问题。首先,我在做getOAuthRequestToken() 时得到它。我的消费者密钥和消费者秘密来自 .properties 文件,结果发现它们有一个尾随空格,因此被 Twitter 的 API 视为无效。

在那之后,我在执行getOAuthAccessToken() 时也得到了相同的 401。在这里,我没有正确地坚持和重建RequestToken 对象。

【讨论】:

你有解决这个问题的办法吗?我使用了 twitter4j-media-support-4.0.4 jar 文件【参考方案3】:

当我连续两次调用以下命令时,这发生在我身上:

 requestToken = twitter.getOAuthRequestToken();
    return requestToken.getAuthorizationURL();

【讨论】:

我遇到了同样的问题...两次是由于用户第一次取消了 oAUTH,然后在第二次返回授权。我们在调用中使用了 twitter.getSingleton “可重用”实例……这不起作用。每次我们都必须使用 ConfigurationBuilder 来创建 twitter 实例【参考方案4】:

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

【讨论】:

【参考方案5】:

我也偶然发现了这个问题。在另一个线程中检查我的解决方案Android: Twitter4J Exception (Received Authentication Challenge Is Null)

【讨论】:

【参考方案6】:

我遇到了同样的问题,并通过使用异步任务修复了它 正如我在以下链接中回答的那样 Android Twitter exception error :(

【讨论】:

以上是关于Twitter4J + Android:身份验证挑战为空异常的主要内容,如果未能解决你的问题,请参考以下文章

Twitter4J AccessToken 生成

使用 oauth 和 twitter4j 集成 Android Twitter

使用twitter4j库的Twitter Android登录错误

使用 Android AccountManager Twitter 凭据创建 Twitter4J AccessToken

如何在按钮点击 android - twitter4j 上获取 twitter 热门话题?

.NET HttpClient 在使用 NTLM 协商时不会在对 IIS 的请求之间保持身份验证