2014-01-21 2 views
2

트위터 작업을하려고합니다.Twitter OAuth 문제 : 오류 401

수신 오류 : 인증에 실패했습니다 (서버가 401로 응답 함). 이것은 소비자 키가 올바르지 않거나 서명이 일치하지 않는 경우에 발생할 수 있습니다.

이미 많은 문제가 여기 stackoverflow에서 이미 확인되었습니다. 여기에서 이미 시도한 내용 : 1) 소비자 키 확인 dev.twitter.com에서 내 앱용 콜백 URL을 추가했습니다. 3) 업데이트 된 라이브러리를 twitter-4j-core-3.0.5.jar 에 업데이트했습니다. 4) 내 시간 타블렛이 맞음 (동유럽 시간 설정)

또한 나는 지난 몇 달 전에 응용 프로그램의 트위터가 제대로 작동했다고 말해야합니다. 그럼 어떻게 든 부서졌습니다.

여기 내 코드입니다 : 지난 달에

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

답변 해 주신 Terence. – zapekankaaa

+0

REQUEST_TOKEN_URL, ACCESS_TOKEN_URL 및 AUTORIZE_URL의 경로 시작 부분을 "https://api.twitter.com/1.1/"로 바꾸려고했지만이 경우 로그인 트위터 페이지에도 액세스 할 수 없습니다. (전에 가능했다). 또한 dev.twitter.com의 요청 URI (OAuth 도구 부분)를 변경하려고 시도했지만 이러한 설정은 저장하지 않습니다. 이러한 요청에 대해 oauth 서명 만 볼 수 있습니다. URL을 "https://api.twitter.com/1.1/"로 변경할 때 추가해야합니까? – zapekankaaa

관련 문제