2014-01-21 71 views
2

我正在尝试让推特工作。Twitter OAuth问题:错误401

我收到的错误是: 授权失败(服务器回答401)。如果消费者密钥不正确或签名不匹配,可能会发生这种情况

我已经在这里检查了很多相同的问题,在stackoverflow和这里我已经尝试过: 1)检查消费者密钥(这是2)在dev.twitter.com上为我的应用程序添加回调URL 3)更新后的库到twitter-4j-core-3.0.5.jar 4)检查我的时间平板电脑是正确的(设置东欧时间)

另外我必须说,在一个月前Twitter的应用程序工作正常。然后不知何故它崩溃了。

这里是我的代码:

class GetOAuthVerifierTask extends AsyncTask<Void, Void, String> { 
    private Context context; 

    public GetOAuthVerifierTask(Context context) { 
     this.context = context; 
     dialog = ProgressDialog.show(TwitterActivity.this, getString(CANNOT_GET_REQUEST_TOKEN), null); 
    } 

    @Override 
    protected String doInBackground(Void... params) { 
     TwitterUtils twitterUtils = TwitterUtils.getInstance(); 

     OAuthConsumer consumer = twitterUtils.createConsumer(); 
     OAuthProvider provider = twitterUtils.createProvider(); 
     try { 
      final String url = provider.retrieveRequestToken(consumer, 
          twitterUtils.getCallbackURL(context)); 
      twitterUtils.setConsumerToken(context, consumer.getToken()); 
      twitterUtils.setConsumerSekretToken(context, consumer.getTokenSecret()); 

      return url; 
     } catch (Exception e) { 
      Logger.debug("Can not retrieve request token"); 
      Logger.error(e.getMessage(), e); 
      return null; 
     } 
    } 

    @Override 
    protected void onPostExecute(String url) { 
     dialog.dismiss(); 
     if (url != null){ 
      // HERE IT WORKS CORRECT 
      web.loadUrl(url); 
     } 

     else{ 
      Toast.makeText(TwitterActivity.this, getString(DOWNLOAD_WAIT_MESSAGE), 
        Toast.LENGTH_LONG).show(); 
     } 

    } 
} 

class GetAccessTokenTask extends AsyncTask<Uri, Void, Boolean> { 
    @Override 
    protected void onPreExecute() { 
     dialog = ProgressDialog.show(TwitterActivity.this, getString(CANNOT_GET_REQUEST_TOKEN), null); 
    } 

    @Override 
    protected Boolean doInBackground(Uri... params) { 
     TwitterUtils twitterUtils = TwitterUtils.getInstance(); 

     String oauthVerifier = params[0].getQueryParameter(OAuth.OAUTH_VERIFIER); 

     OAuthConsumer consumer = twitterUtils.createConsumer(); 
     consumer.setTokenWithSecret(twitterUtils.getConsumerToken(TwitterActivity.this), 
         twitterUtils.getConsumerSekretToken(TwitterActivity.this)); 
     OAuthProvider provider = twitterUtils.createProvider(); 
     try { 
      provider.retrieveAccessToken(consumer, oauthVerifier); 

      twitterUtils.setAccessToken(TwitterActivity.this, consumer.getToken()); 
      twitterUtils.setAccessTokenSecret(TwitterActivity.this, consumer.getTokenSecret()); 
     } catch (Exception e) { 
      Logger.debug("Can not retrieve access token"); 
      Logger.error(e.getMessage(), e); 
      return false; 
     } 

     return true; 
    } 

    @Override 
    protected void onPostExecute(Boolean result) { 
     dialog.dismiss(); 
     if (result) { 
      TwitterActivity.this.sendMessage(); 
      TwitterActivity.this.finish(); 
     } else { 
      // HERE I GET 401 
      Toast.makeText(TwitterActivity.this, getString(DOWNLOAD_WAIT_MESSAGE), 
          Toast.LENGTH_LONG).show(); 
     } 
    } 
} 

回答

2

刚刚找到解决方案: 我加了一行 provider.setOAuth10a(true); (用于我的OAuthProvider)

解释在源代码中找到: // 1.0a期望在获取请求令牌时发送回调。 // 1.0服务提供商会简单地忽略此参数。

1

在过去一个月中,一直是change to the Twitter API。您现在可以使用HTTPS仅调用

您应该确保URL你/你的图书馆使用开始与

https://api.twitter.com/1.1/ 

(注意http后的额外s

您可能需要检查与twitter4j的维护者。

+0

感谢您的回答,特伦斯。 – zapekankaaa

+0

我试图用“https://api.twitter.com/1.1/”替换REQUEST_TOKEN_URL,ACCESS_TOKEN_URL和AUTORIZE_URL的路径开始,但在这种情况下,我甚至无法访问登录Twitter页面。 (之前可能)。还尝试更改dev.twitter.com上的请求URI(在OAuth工具部分中) - 但它不保存此类设置。只有这样的请求才能看到oauth签名。在将URL更改为“https://api.twitter.com/1.1/”时,我应该做些什么? – zapekankaaa