2014-01-21 119 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