安卓Twitter检索请求令牌时出现401错误

13

我正在尝试使用以下Twitter OAuth的示例应用程序。

http://www.androidsdkforum.com/android-sdk-development/3-oauth-twitter.html

private void askOAuth() {
        try {
            consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
            provider = new DefaultOAuthProvider("http://twitter.com/oauth/request_token",
                                                "http://twitter.com/oauth/access_token",
                                                "http://twitter.com/oauth/authorize");
            String authUrl = provider.retrieveRequestToken(consumer, CALLBACK_URL);
            Toast.makeText(this, "Please authorize this app!", Toast.LENGTH_LONG).show();
            this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl)));
        } catch (Exception e) {
            Log.e(APP, e.getMessage());
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }

当我运行以下代码时,会出现以下异常:

"oauth.signpost.exception.OAuthNotAuthorizedException:授权失败(服务器回复401)。如果消费者密钥不正确或签名不匹配,可能会发生这种情况。"

在此行中:String authUrl = provider.retrieveRequestToken(consumer, CALLBACK_URL);

我提供了正确的“key”和“secret”,Twitter给错了我的密钥和秘密吗?


请告诉我在 CALLBACK_URL 中应该放什么? - Shruti
您的Android活动URL,将在Twitter返回响应后被调用。 - d-man
你的Android活动URL,一旦Twitter返回响应,它将被调用。 - d-man
如果我需要加载一个活动,那么在回调URL中应该放什么?目前我已经在回调URL中添加了someting.com,以便加载网页。请指导我。 - Shruti
可能是Android Twitter Outh教程回调问题的重复。 - Bo Persson
也许你可以在这里找到解决方案...http://stackoverflow.com/a/20115215/2106820 - Arfan Mirza
6个回答

14

我已经花费了数小时的时间。似乎你需要在Twitter应用程序开发者面板的“设置”选项卡中为回调URL设置任何值。保留默认的空值将禁用动态回调URL。

所有教程和在线信息都是无效的。Twitter早已移除了“客户端/网站”单选按钮。

此外,OAuth会检查时钟偏差。


2
在回调URL中设置某些内容(例如https://dev.twitter.com)对我很有效。 - Luke Quinane

8

我之前也遇到过同样的问题。这个问题只在我的开发手机上出现,但是在模拟器和另一部手机上,代码可以正常运行。尝试了几种相关问题的解决方案都没有成功,最终发现是因为我没有在开发手机上设置日期和时间,因为它没有SIM卡。这导致SSL证书无效,OAuth请求失败,以及任何使用HTTPS的东西都会出现问题。设置时间后,问题就解决了。


似乎有许多其他可能导致相同问题的原因,但我以前没有找到建议,可能是因为这不完全是Twitter或OAuth本身的问题。 - DonSteep
4
+1,你关于在没有SIM卡的手机中设置日期和时间是正确的。 - Paresh Mayani

4

1)将日期和时间设置为正确的值,这将有助于解决此问题。

2)

private OAuthConsumer consumer;
private OAuthProvider provider;
...
...
...
provider = new CommonsHttpOAuthProvider (
                TWITTER_REQUEST_TOKEN_URL, 
                TWITTER_ACCESS_TOKEN_URL,
                TWITTER_AUTHORIZE_URL);

private void askOAuth() {
        try {
            consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
            provider = new CommonsHttpOAuthProvider("http://twitter.com/oauth/request_token",
                                                "http://twitter.com/oauth/access_token",
                                                "http://twitter.com/oauth/authorize");

            provider.setOAuth10a(true);

            String authUrl = provider.retrieveRequestToken(consumer, CALLBACK_URL);
            Toast.makeText(this, "Please authorize this app!", Toast.LENGTH_LONG).show();
            this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl)));
        } catch (Exception e) {
            Log.e(APP, e.getMessage());
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }

3) 您的 Twitter 应用程序是否配置为浏览器? 请使用以下密钥:

Consumer key(消费者密钥)

sdOjEI2cOxzTLHMCCMmuQ

Consumer secret(消费者秘钥)

biI3oxIBX2QMzUIVaW1wVAXygbynuS80pqSliSDTc


我正在模拟器中尝试上述代码,并在设备上进行了测试,但两种情况下都没有成功。我将尝试通过设置模拟器日期和时间来再次尝试。 - d-man
我已经测试了http://code.google.com/p/agirardello/的示例,没有任何问题,你确定你的Twitter应用程序配置为浏览器应用程序吗?请尝试使用以下密钥:消费者密钥:sdOjEI2cOxzTLHMCCMmuQ,消费者密钥:biI3oxIBX2QMzUIVaW1wVAXygbynuS80pqSliSDTc。 - Jorgesys
你好。我在Titanium中编写了一段代码,当我使用上述的Consumer key和Consumer secret key时,它能够完美地工作。但是当我在Twitter上创建自己的应用程序时,它就无法正常工作了。请问您在Twitter应用程序中做了哪些特殊的更改?谢谢。 - AvtarSingh Suchariya
是的,设置正确的日期/时间解决了我的问题,但为什么会这样呢?为什么 Twitter API 现在需要正确的日期/时间? - Zoombie
1
设置日期时间后,应用程序将在设备上正常工作。 - Ali Ahmad

2

在提供者中使用https代替http


1

我意识到你即使在其他用户的帮助下也会回答自己的问题以获取积分。 - Jorgesys

1

是的,totramon是正确的...如果您只在身份验证问题上遇到问题,您可能需要设置设备时间。我曾经遇到过同样的问题,并仅通过这个解决方案解决了它。另外,如果您正在使用旧版Twitter API,则需要将其更改为稳定版本API(2.1.4)。您可以从以下链接中找到:

http://twitter4j.org/en/index.html

享受...


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