2011-10-20 23 views
5

Bien, entonces, estoy haciendo un cliente de Tumblr para Android, hace casi una semana que intento y no consigo utilizar OAuth. Así es como va:Android Tumblr Oauth-signpost 401

El usuario activa la aplicación. La actividad principal de onCreate hace esto:

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

esto inicia una actividad de autenticación que contiene un WebView. Esa actividad obtiene con éxito el token de solicitud y envía el WebView a la pantalla de inicio de sesión de Tumblr. Se le pide al usuario que permita el acceso a sus datos mediante la aplicación, presionan Permitir, y mi WebViewClient llama la devolución de llamada URL, y lo hace con ella:

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 de la clase de ayuda y getVerifier tener este aspecto:

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

Entonces finalmente volver a la pantalla principal de la aplicación y trato de hacer mi primera llamada a la API, para obtener las más recientes diez puestos en el salpicadero del usuario:

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

Sin embargo, en lugar de obtener una buena respuesta JSON como que debe ser, me estoy haciendo esto:

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

Entonces, ¿dónde me equivoqué? Gracias

+1

Estoy recibiendo exactamente el mismo problema con el que trato de utilizar los métodos API que requieren solicitudes POST, sin embargo, las solicitudes GET parecen funcionar bien. Estoy empezando a preguntarme si su API es un poco escamosa. –

+0

¿En qué versión de Android está desarrollando? – NotACleverMan

+0

Solo nido de abeja. – Nick

Respuesta

2

He utilizado con éxito la biblioteca de señal con Appache HttpCommons GET/POST/PUT.

En primer lugar, me he lanzado la vista Web para propósitos de inicio de sesión, usando el siguiente código (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))); 
} 

Entonces, he utilizado onNewIntent(Intent) para recibir devoluciones de llamada de OAuth desde la puesta en marcha anteriormente Activity:

AppConfig.java código 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 código 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(); 
    } 

} 

Y entonces, mi código de conexión se ve así:

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

que puede haber perdido algo durante copiar y pegar, sólo dime si esta solución funcionará para usted. Estoy usando Singpost 1.2.1.1

+0

No tengo tiempo para probar su código en este momento, o incluso dentro de los próximos días. Pero como la recompensa se estaba agotando y parece una publicación completa muy útil, ¡tú ganas! Gracias, descubriré si funciona más tarde – Nick

+0

Ten en cuenta que utilizo dos pares de llaves allí mismo: 'AppConfig.CONSUMER_KEY, AppConfig.CONSUMER_SECRET' (que se almacenan en la aplicación), y' Data.OAuthAccessKey, Data.OAuthAccessSecret' que son generados por el servidor. – Kocus

+0

recibiendo la misma respuesta no autorizada: {"meta": { "estado": 401, "msg": "No autorizado"}, "respuesta": []} – DcodeChef

1

Actualmente, Tumblr no es compatible con MultipartEntity, por lo que debe usar NameValuePairs para agregar parámetros.

Si desea publicar una foto, DEBE convertirla en un ARRAY y en una URL que la codifique.

+0

Problema enfrentado con la publicación de fotos. ¿A qué te refieres con decir "... convertir esa foto en un ARRAY y una URL que la codifique"? ¿Podría proporcionar algún fragmento de código? –

+0

La propia biblioteca de Tumbler (Jumblr) usa formularios de varias partes: https://github.com/tumblr/jumblr/blob/master/src/main/java/com/tumblr/jumblr/request/MultipartConverter.java – Jabari