2011-10-20 65 views
5

好的,所以,我正在爲Android創建一個Tumblr客戶端,我一直在嘗試並且無法讓OAuth工作大約一個星期。這是如何去的:Android Tumblr Oauth-signpost 401

用戶啓動應用程序。主要活動的onCreate是這樣做的:

settings = getSharedPreferences(PREFS_NAME, 0); 
authToken=settings.getString("OauthToken", "none"); 
authTokenSecret=settings.getString("OauthSecret", "none"); 
if(authToken=="none" || authTokenSecret=="none"){ 
    Intent i = new Intent(getApplicationContext(),Authentication.class); 
    startActivity(i); 
} 

這將啓動一個包含WebView的認證活動。該活動成功獲取請求令牌,並將WebView發送到Tumblr登錄屏幕。用戶被要求以允許該應用程序,它們按允許,訪問他們的數據和我的WebViewClient捕捉回調URL,以及這是否與它:

String[] token = helper.getVerifier(url); 
      if (token != null) { 
       try { 
        String accessToken[] = helper.getAccessToken(token[1]); 
        editor.putString("OauthToken", accessToken[0]); 
        editor.putString("OauthSecret", accessToken[1]); 
        editor.commit(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      finish(); 

助手類的getAccessToken和getVerifier是這樣的:

public String[] getVerifier(String myUrl) { 
    // extract the token if it exists 
    Uri uri = Uri.parse(myUrl); 
    if (uri == null) { 
     return null; 
    } 

    String token = uri.getQueryParameter("oauth_token"); 
    String verifier = uri.getQueryParameter("oauth_verifier"); 
    return new String[] { token, verifier }; 
} 

public String[] getAccessToken(final String verifier) 
     throws OAuthMessageSignerException, OAuthNotAuthorizedException, 
     OAuthExpectationFailedException, OAuthCommunicationException { 
    new Thread(new Runnable() { 
     public void run() { 
       try { 
        mProvider.retrieveAccessToken(mConsumer, verifier); 
       } catch (OAuthMessageSignerException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (OAuthNotAuthorizedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (OAuthExpectationFailedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } catch (OAuthCommunicationException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
     } 
    }).start(); 
    return new String[] { 
      mConsumer.getToken(), mConsumer.getTokenSecret() 
    }; 
} 

後來我終於回到主應用程序屏幕,並設法使我的第一個API調用,以獲得用戶的儀表板最近的10個職位:

OAuthConsumer myConsumer = new CommonsHttpOAuthConsumer(MainView.authToken, MainView.authTokenSecret); 
      HttpGet request = new HttpGet("http://api.tumblr.com/v2/user/dashboard?limit=10"); 
      myConsumer.sign(request); 
      HttpClient httpClient = new DefaultHttpClient(); 
      HttpResponse response = httpClient.execute(request); 
      HttpEntity entity = response.getEntity(); 
      BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent())); 
      String line; 
      while ((line = reader.readLine()) != null) { 
       builder.append(line); 
      } 

然而,而不是越來越像一個很好的JSON響應我應該是,我得到這個:

10-20 16:36:18.110: D/Result(22817): {"meta":{"status":401,"msg":"Not Authorized"},"response":[]} 

那麼,我是不是錯了?謝謝

+1

我得到這個完全相同的問題,我嘗試使用需要POST請求的API方法,但是,GET請求似乎工作正常。我開始懷疑他們的API是否有點片面。 –

+0

你在開發什麼版本的android? – NotACleverMan

+0

僅限蜂巢。 – Nick

回答

2

我已經成功地使用Appache HttpCommons的路標庫GET/POST/PUTs。

首先,我已經發起了登錄目的web視圖,使用以下代碼(ActivityLogin.java):

private static CommonsHttpOAuthConsumer consumer = new CommonsHttpOAuthConsumer(AppConfig.CONSUMER_KEY, AppConfig.CONSUMER_SECRET); 
private static OAuthProvider provider = new DefaultOAuthProvider (AppConfig.requestURL, AppConfig.accessURL, AppConfig.authURL); 

private void logMeIn() throws ...{ 
    String authUrl = provider.retrieveRequestToken(consumer,AppConfig.CALLBACK_URL); 
    startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(authUrl))); 
} 

然後,我使用onNewIntent(Intent)用於從先前發射Activity接收的OAuth回調:

AppConfig.java一小段代碼片段:

/** OAuth Authorization URL */ 
public static final String authURL = mainOAuthUrl+"/authorize/?theme=android"; 

/** OAuth Request URL */ 
public static final String requestURL = mainOAuthUrl+"/request/token/"; 

/** OAuth Access URL  */ 
public static final String accessURL = mainOAuthUrl+"/access/token/"; 

/** OAuth CALLback URL*/ 
public static final String CALLBACK_URL = "yourapp://twitt"; 

ActivityLogin.java代碼snipet:

protected void onNewIntent(Intent intent) { 
    Uri uri = intent.getData(); 
    if (uri != null && uri.toString().startsWith(AppConfig.CALLBACK_URL)) { 
     String verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER); 

     provider.retrieveAccessToken(consumer, verifier); 
     Data.OAuthAccessKey = consumer.getToken(); 
     Data.OAuthAccessSecret = consumer.getTokenSecret(); 
    } 

} 

然後,我的連接代碼看起來像這樣:

public HttpResponse sampleOauthConnect(String url) throws ...{ 

    /** setup some connection params */ 
    HttpContext context = new BasicHttpContext(); 

    HttpRequestBase request = new HttpGet(url); 

    if (Data.OAuthConsumer == null) 
     Data.OAuthConsumer = new CommonsHttpOAuthConsumer(AppConfig.CONSUMER_KEY, AppConfig.CONSUMER_SECRET); 

    if (Data.OAuthAccessKey == null || Data.OAuthAccessSecret == null) 
     throw new LoginErrorException(LoginErrorException.NOT_LOGGED_IN); 

    Data.OAuthConsumer.setTokenWithSecret(Data.OAuthAccessKey, Data.OAuthAccessSecret); 

    try { 
     Data.OAuthConsumer.sign(request); 
    } catch (OAuthMessageSignerException e) { 
     throw new LoginErrorException(LoginErrorException.OAUTH_EXCEPTION, e); 
    } catch (OAuthExpectationFailedException e) { 
     throw new LoginErrorException(LoginErrorException.OAUTH_EXCEPTION, e); 
    } catch (OAuthCommunicationException e) { 
     throw new LoginErrorException(LoginErrorException.OAUTH_EXCEPTION, e); 
    } 

    HttpClient client = new DefaultHttpClient(); 

    /** finally execute this request */ 
    return client.execute(request, context); 
} 

我可能已經錯過了複製粘貼過程中的東西,只是告訴我,如果這個解決方案會爲你工作。我正在使用singpost 1.2.1.1

+0

我沒有時間來測試您的代碼,或者甚至但是既然賞金已經用完了,它看起來像是一個超級有用的徹底的帖子,你贏了!謝謝你,我會發現它是否真的能在以後工作 – Nick

+0

請記住,我使用兩對鍵在那裏:服務器生成'AppConfig.CONSUMER_KEY,AppConfig.CONSUMER_SECRET'(存儲在應用中)和'Data.OAuthAccessKey,Data.OAuthAccessSecret'。 – Kocus

+0

獲得相同的響應未授權: {「meta」:{ 「status」:401,「msg」:「Not Authorized」},「response」:[]} – DcodeChef

1

目前,Tumblr不支持MultipartEntity,因此您必須使用NameValuePairs添加參數。

如果你想發佈一張照片,你必須將該照片轉換爲ARRAY並對其進行網址編碼!

+0

面對照片發佈的問題。您是說「將該照片轉換爲ARRAY並將其編碼爲網址」是什麼意思?你能提供一些代碼片段嗎? –

+0

不倒翁自己的圖書館(Jumblr)使用多部分形式:https://github.com/tumblr/jumblr/blob/master/src/main/java/com/tumblr/jumblr/request/MultipartConverter.java – Jabari

相關問題