安卓 OAuth : Exception on retrieveAccessToken()

标签 android twitter oauth signpost

我正在为我的 Android 应用设置 OAuth。为了测试它,我做了以下事情: 将 signpost-core-1.2.1.1.jar 和 signpost-commonshttp4-1.2.1.1.jar 添加到我的项目中,添加了变量“CommonsHttpOAuthConsumer consumer”和“CommonsHttpOAuthProvider provider”,并在单击按钮时执行以下操作:

consumer = new CommonsHttpOAuthConsumer("xxx", "yyy");
provider = new CommonsHttpOAuthProvider("https://api.twitter.com/oauth/request_token", 
                    "https://api.twitter.com/oauth/access_token", 
                    "https://api.twitter.com/oauth/authorize");

oauthUrl = provider.retrieveRequestToken(consumer, "myapp://twitterOauth");
persistOAuthData();
this.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(oauthUrl)));

persistOAuthData() 执行以下操作:

protected void persistOAuthData()
{
    try
    {
        FileOutputStream providerFOS = this.openFileOutput("provider.dat", MODE_PRIVATE);
        ObjectOutputStream providerOOS = new ObjectOutputStream(providerFOS);
        providerOOS.writeObject(this.provider);
        providerOOS.close();

        FileOutputStream consumerFOS = this.openFileOutput("consumer.dat", MODE_PRIVATE);
        ObjectOutputStream consumerOOS = new ObjectOutputStream(consumerFOS);
        consumerOOS.writeObject(this.consumer);
        consumerOOS.close();
    }
    catch (Exception e) { }
}

因此,在打开浏览器之前保存了消费者和提供者,如所述here .

在 onResume() 方法中,我加载提供者和消费者数据并执行以下操作:

    Uri uri = this.getIntent().getData();
    if (uri != null && uri.getScheme().equals("myapp") && uri.getHost().equals("twitterOauth"))
    {
        verifier = uri.getQueryParameter(oauth.signpost.OAuth.OAUTH_VERIFIER);
        if (!verifier.equals(""))
        {
            loadOauthData();
            try
            {
                provider.retrieveAccessToken(consumer, verifier);
            }
            catch (OAuthMessageSignerException e) {
                e.printStackTrace();
            } catch (OAuthNotAuthorizedException e) {
                e.printStackTrace();
            } catch (OAuthExpectationFailedException e) {
                e.printStackTrace();
            } catch (OAuthCommunicationException e) {
                e.printStackTrace();
            }            
        }
    }

那么,什么有效: 1) 我确实得到了一个 requestToken 和一个 requestSecret。 2) 我确实得到了 oauthUrl。 3) 我被定向到浏览器页面以授权我的应用程序 4) 我被重定向到我的应用程序。 5)我确实得到了验证者。 但是调用 retrieveAccessToken(consumer, verifier) 失败并出现 OAuthCommunicationException 消息“与服务提供商的通信失败:null”。

有人知道是什么原因吗?有些人似乎在获取 requestToken 时遇到问题,但这很好用。我想知道我的应用程序还包含分段上传所需的 apache-mime4j-0.6.jar 和 httpmime-4.0.1.jar 是否有问题。

最佳答案

好吧,我明白了。也许这对其他人有帮助:

首先,您不需要保存整个消费者和提供者对象。您需要做的就是存储 requestToken 和 requestSecret。幸运的是,这些是字符串,因此您不需要将它们写入磁盘或其他任何东西。只需将它们存储在 sharedPreferences 或类似的东西中。

现在,当您被浏览器重定向并调用您的 onResume() 方法时,只需执行以下操作:

//The consumer object was lost because the browser got into foreground, need to instantiate it again with your apps token and secret.
consumer = new CommonsHttpOAuthConsumer("xxx", "yyy"); 

//Set the requestToken and the tokenSecret that you got earlier by calling retrieveRequestToken.
consumer.setTokenWithSecret(requestToken, tokenSecret);

//The provider object is lost, too, so instantiate it again.
provider = new CommonsHttpOAuthProvider("https://api.twitter.com/oauth/request_token", 
                                "https://api.twitter.com/oauth/access_token", 
                                "https://api.twitter.com/oauth/authorize");     
//Now that's really important. Because you don't perform the retrieveRequestToken method at this moment, the OAuth method is not detected automatically (there is no communication with Twitter). So, the default is 1.0 which is wrong because the initial request was performed with 1.0a.
provider.setOAuth10a(true);

provider.retrieveAccessToken(consumer, verifier);

就是这样,您现在可以使用 getToken() 和 getTokenSecret() 接收 token 和 secret 。

关于安卓 OAuth : Exception on retrieveAccessToken(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3255153/

相关文章:

java - 在异步线程中解析时出现 fatal error (AsyncTask.doInBackground())

Android AsyncTask 奇怪地发布重复项

android - 向 Android 中的 Spinner 添加 "Please Select"选项

php - 使用 Twitter 单一访问 token 的 Zend OAuth

api - 推特 API : allow authenticated user to post tweets on another user's behalf

java - 简单计时器应用程序的架构

swift - 通过 View Controller 中途实现 Twitter 时间轴?

java - 如何正确转义推文以将其作为 JSON 发送到 socket.io?

ruby - 使用 ruby​​ 获取自日期 y 以来用户 x 的所有推文?

java - 适用于 Android 的 Google 登录 - 发布与调试