2011-10-20 23 views
5

Được rồi, vì vậy, tôi đang tạo một ứng dụng Tumblr cho Android, tôi đã cố gắng và không làm cho OAuth hoạt động được khoảng một tuần nay. Dưới đây là cách thực hiện:Android Tumblr Oauth-biển hiệu 401

Người dùng kích hoạt ứng dụng. Hoạt động chính của onCreate thực hiện điều này:

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); 
} 

điều này sẽ khởi chạy hoạt động xác thực có chứa WebView. Hoạt động đó đã nhận được mã thông báo yêu cầu và gửi WebView đến màn hình đăng nhập Tumblr. Người dùng được yêu cầu để cho phép truy cập vào dữ liệu của mình bằng cách ứng dụng, họ nhấn Allow, và WebViewClient tôi bắt Callback Url, và thực hiện điều này với nó:

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 Lớp helper và getVerifier trông như thế này:

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() 
    }; 
} 

sau đó, cuối cùng tôi đã quay trở lại màn hình ứng dụng chính và cố gắng để thực hiện cuộc gọi API đầu tiên của tôi, để có được mười bài viết gần đây nhất trên bảng điều khiển của người dùng:

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); 
      } 

Tuy nhiên, thay vì nhận được một phản ứng JSON đẹp như tôi nên được, tôi nhận được điều này:

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

Vì vậy, nơi nào tôi đi sai? Cảm ơn

+1

Tôi nhận được vấn đề này chính xác tương tự với tôi cố gắng sử dụng phương pháp API yêu cầu POST yêu cầu tuy nhiên, yêu cầu GET xuất hiện để làm việc tốt. Tôi bắt đầu tự hỏi liệu API của họ có hơi không ổn định. –

+0

Bạn đang phát triển phiên bản Android nào? – NotACleverMan

+0

Chỉ có tổ ong. – Nick

Trả lời

2

Tôi đã sử dụng thành công thư viện biển hiệu bằng Appache HttpCommons GET/POST/PUT.

Thứ nhất, tôi đã tung ra WebView cho mục đích đăng nhập, sử dụng đoạn mã sau (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))); 
} 

Sau đó, tôi đã sử dụng onNewIntent(Intent) nhận callbacks OAuth từ giới thiệu trước đây Activity:

AppConfig.java đang snipet:

/** 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 đang 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(); 
    } 

} 

Và sau đó, mã kết nối của tôi trông như thế:

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); 
} 

tôi có thể đã bỏ lỡ một cái gì đó trong copy-paste, chỉ cần cho tôi biết nếu giải pháp này sẽ làm việc cho bạn. Tôi đang sử dụng singpost 1.2.1.1

+0

Tôi không có thời gian để kiểm tra mã của bạn ngay bây giờ hoặc thậm chí trong vòng vài ngày tới, nhưng vì tiền thưởng đã hết và nó trông giống như một bài viết siêu hữu ích, bạn thắng! Cảm ơn bạn, tôi sẽ tìm hiểu xem nó có thực sự hoạt động sau này không? – Nick

+0

Hãy nhớ rằng tôi sử dụng hai cặp khóa ngay tại đó: 'AppConfig.CONSUMER_KEY, AppConfig.CONSUMER_SECRET' (được lưu trong ứng dụng) và' Data.OAuthAccessKey, Data.OAuthAccessSecret' được tạo bởi máy chủ. – Kocus

+0

nhận được phản hồi tương tự không được phép: {"meta": { "trạng thái": 401, "msg": "Không được ủy quyền"}, "phản hồi": []} – DcodeChef

1

Hiện tại, Tumblr không hỗ trợ MultipartEntity, vì vậy bạn phải sử dụng NameValuePairs để thêm thông số.

Nếu bạn muốn đăng ảnh, bạn PHẢI chuyển ảnh đó sang ARRAY và URL mã hóa ảnh đó!

+0

Gặp sự cố với đăng ảnh. Bạn có ý gì khi nói "... chuyển đổi ảnh đó thành ARRAY và URL mã hóa nó"? Bạn có thể cung cấp một số đoạn mã. –

+0

Thư viện riêng của Tumbler (Jumblr) sử dụng các biểu mẫu nhiều phần: https://github.com/tumblr/jumblr/blob/master/src/main/java/com/tumblr/jumblr/request/MultipartConverter.java – Jabari

Các vấn đề liên quan