在android中使用路标请求访问令牌时获取401

时间:2011-03-27 10:25:24

标签: android oauth twitter-oauth signpost

这是我的代码,我不断收到异常“授权失败(服务器回复401)。如果消费者密钥不正确或签名不匹配,就会发生这种情况。”在这一行'provider.retrieveAccessToken(消费者,验证者);'。我已经检查了我的消费者密钥和秘密,并且我的Twitter应用程序被设置为浏览器并尝试设置provider.setOAuth10a(true),我一直在为此奋斗2天!我正在使用路标1.2.1.1(core& commonshttp4),如果有人可以提供帮助!请我绝望

    private static final String CONSUMER_KEY = "MY_CONSUMER_KEY";
    private static final String CONSUMER_SECRET = "MY_CONSUMER_SECRET";

    private static final String CALLBACK_URL = "tweet-mapper://mainactivity";

    private static final String REQUEST_URL = "https://api.twitter.com/oauth/request_token";
    private static final String ACCESS_TOKEN_URL = "https://api.twitter.com/oauth/access_token";
    private static final String AUTH_URL = "https://api.twitter.com/oauth/authorize";

    private static final String PREFERENCE_FILE = "twitter_oauth.prefs";

    private static CommonsHttpOAuthConsumer consumer;
    private static CommonsHttpOAuthProvider provider;

    private static String ACCESS_KEY;
    private static String ACCESS_SECRET;

    private Twitter twitter;


    /**
     * Called when the activity is first created.
     */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        loginViaOAuth();

    }

    private void loginViaOAuth() {
        try {
            consumer = new CommonsHttpOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
            provider.setOAuth10a(true);
            provider = new CommonsHttpOAuthProvider(REQUEST_URL, ACCESS_TOKEN_URL, AUTH_URL);
            String authURL = provider.retrieveRequestToken(consumer, CALLBACK_URL);
            this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authURL)));
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
        }
    }

    @Override
    protected void onResume() {

        super.onResume();

        Uri uri = this.getIntent().getData();
        if (uri != null && uri.toString().startsWith(CALLBACK_URL)) {
            String verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER);
            Log.d("verifier:", verifier);
            try {

                provider.setOAuth10a(true);
                provider.retrieveAccessToken(consumer, verifier);
                ACCESS_KEY = consumer.getToken();
                ACCESS_SECRET = consumer.getTokenSecret();

                AccessToken a = new AccessToken(ACCESS_KEY, ACCESS_SECRET);

                // initialize Twitter4J
                twitter = new Twitter();
                twitter.setOAuthConsumer(CONSUMER_KEY, CONSUMER_SECRET);
                twitter.setOAuthAccessToken(a);
                String tweet = "#OAuth working via android app!";

                twitter.updateStatus(tweet);
                Toast.makeText(this, tweet, Toast.LENGTH_LONG).show();

            } catch (Exception e) {
                e.printStackTrace();
                Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
            }
        }

3 个答案:

答案 0 :(得分:1)

刚刚找到了一个可能的解决方案:您需要在Twitter应用程序帐户上设置回调URL。

答案 1 :(得分:0)

我在Android应用程序上遇到了完全相同的问题。更令人沮丧的是,我的Twitter登录工作完全正常,并且由于某些随机原因而开始失败。

我进行了大量测试,发现问题来自于OAuth流程中使用的Android浏览器:

  • 如果您使用存储的登录名/密码登录,或者如果您的Twitter会话中有cookie并且只需单击“接受”,则填充失败并显示401错误
  • 如果您手动删除并重新输入密码,那么它就可以了!

我仍然无法理解这会如何影响API调用,但我想当您提交带有预先输入信息的“接受”表单时,浏览器会出现混乱。

我很想知道我的解决方法是否也解决了你的问题。我知道这不是一个合适的解决方案,但这是一个开始。

编辑:使用http://代替https://用于Twitter OAuth网址,它解决了问题。我仍然不知道发生了什么......

答案 2 :(得分:0)

检查你的api请求,它必须是.json或.xml,类似于 https://api.jabbakam.com/network/get_list.jsonhttp://api.twitter.com/1/account/verify_credentials.xml

我建议你使用Scribe库,有一个内置的类用于使用Twitter API。

https://github.com/fernandezpablo85/scribe-java/blob/master/src/test/java/org/scribe/examples/TwitterExample.java

当您创建Twitter密钥时,您是否进行了访问级别:读写?