2012-07-06 18 views
8

Estoy tratando de integrar Yahoo en mi aplicación.400 Solicitud incorrecta en Autenticación de Yahoo

Quiero usuarios iniciar sesión utilizando sus cuentas de Yahoo, pero cada vez que solicito para un token, que reciben los siguientes errores:

getRequestToken() Exception: oauth.signpost.exception.OAuthCommunicationException: 
Communication with the service provider failed: Service provider responded in error: 400 (Bad Request) 

Aquí está mi código (Request_Token_Activity.java):

import oauth.signpost.OAuth; 
import oauth.signpost.OAuthConsumer; 
import oauth.signpost.OAuthProvider; 
import oauth.signpost.commonshttp.CommonsHttpOAuthConsumer; 
import oauth.signpost.commonshttp.CommonsHttpOAuthProvider; 
import oauth.signpost.signature.HmacSha1MessageSigner; 
import android.app.Activity; 
import android.content.Intent; 
import android.content.SharedPreferences; 
import android.content.SharedPreferences.Editor; 
import android.net.Uri; 
import android.os.Bundle; 
import android.preference.PreferenceManager; 
import android.util.Log; 

public class Request_Token_Activity extends Activity { 
    private OAuthConsumer consumer; 
    private OAuthProvider provider; 
    private SharedPreferences prefs; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    try { 

     consumer = new CommonsHttpOAuthConsumer("my consumer key", "my consumer secret"); 
     consumer.setMessageSigner(new HmacSha1MessageSigner()); 
     provider = new CommonsHttpOAuthProvider(
       "http://api.login.yahoo.com/oauth/v2/get_request_token", 
       "http://api.login.yahoo.com/oauth/v2/get_token", 
       "http://api.login.yahoo.com/oauth/v2/request_auth"); 

    } catch (Exception e) { 
     Log.e("", "onCreate Exception: " + e.toString()); 
    } 
    getRequestToken(); 
} 
private void getRequestToken() { 
    try { 

     String url = provider.retrieveRequestToken(consumer, "yahooapi://callback"); 
     Log.i("", "Yahoo URL: " + url); 
     Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)).setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NO_HISTORY | Intent.FLAG_FROM_BACKGROUND); 
     this.startActivity(intent); 
    } catch (Exception e) { 
     Log.i("", "getRequestToken() Exception: " + e.toString()); 
    } 
} 
@Override 
public void onNewIntent(Intent intent) { 
    super.onNewIntent(intent); 
    prefs = PreferenceManager.getDefaultSharedPreferences(this); 
    final Uri uri = intent.getData(); 
    if (uri != null && uri.getScheme().equals("yahooapi")) { 
     getAccessToken(uri); 
    } 
} 
private void getAccessToken(Uri uri) { 
    final String oauth_verifier = uri.getQueryParameter(OAuth.OAUTH_VERIFIER); 
    try { 
     provider.retrieveAccessToken(consumer, oauth_verifier); 

     final Editor edit = prefs.edit(); 
     edit.putString("YAHOO_OAUTH_TOKEN", consumer.getToken()); 
     edit.putString("YAHOO_OAUTH_TOKEN_SECRET", consumer.getTokenSecret()); 
     edit.commit(); 

     String token = prefs.getString("YAHOO_OAUTH_TOKEN", ""); 
     String secret = prefs.getString("YAHOO_OAUTH_TOKEN_SECRET", ""); 
     consumer.setTokenWithSecret(token, secret); 

     Log.i("", "Yahoo OAuth Token: " + token); 
     Log.i("", "Yahoo OAuth Token Secret: " + token); 

    } catch (Exception e) { 
     Log.i("", "getAccessToken Exception: " + e.toString()); 
    } 
} 

} 

Y esta es una foto de mi AndroidManifest.xml:

 <activity android:name="Request_Token_Activity" android:launchMode="singleTask"> 
     <intent-filter> 
      <action android:name="android.intent.action.VIEW" /> 
      <category android:name="android.intent.category.DEFAULT" /> 
      <category android:name="android.intent.category.BROWSABLE" /> 
      <data android:scheme="yahooapi" android:host="callback" /> 
     </intent-filter> 
    </activity> 

he puesto en marcha mi Yahoo Project como Web Application y ponga Read and Write access en Social y Contacts. ¿Qué estoy haciendo mal?

+0

No sé si esto se aplica aquí o no, pero recuerdo que Yahoo! a veces requiere estar en wifi para conectarse a sus servidores. De nuevo, no estoy seguro de si esto se aplica aquí o si ya es el caso con Yahoo! – Eliezer

Respuesta

3

@Jayson Tamayo Estoy de acuerdo con Eliezer, intente utilizar su aplicación en wifi. Lo intenté en wifi y funciona, pero lamentablemente no funciona en GPRS. Si su aplicación Android es una aplicación nativa, entonces debe configurar su proyecto como Cliente/Escritorio. Lo he hecho y funciona para mí.

4

Parece que la llamada de API de yahoo es una llamada ssl. No sé si es así de simple, pero su código tiene los proveedores Oauth como:

  "http://api.login.yahoo.com/oauth/v2/get_request_token", 
      "http://api.login.yahoo.com/oauth/v2/get_token", 
      "http://api.login.yahoo.com/oauth/v2/request_auth"); 

acuerdo con http://developer.yahoo.com/oauth/guide/oauth-requesttoken.html

El proveedor debe ser http * s * // api.login.yahoo. com/oauth/v2/get_request_token

, además, aquí están los códigos de error yahoo oauth y las razones por las que podría recibir un error 400 http://developer.yahoo.com/oauth/guide/oauth-errors.html me loguea mi solicitud y ver qué parámetro de falta/mal/mal formado etc.

Cuestiones relacionadas