2010-02-04 3 views
7

Mi aplicación Android utiliza la biblioteca Java OAuth, encontró here para la autorización en Twitter. Puedo obtener un token de solicitud, autorizar el token y obtener un reconocimiento, pero cuando el navegador prueba la URL de devolución de llamada para volver a conectarse con mi aplicación, no usa la URL que proporciono en el código, sino que usa la que proporcioné al registrarme. con Twitter.OAuth + Twitter en Android: la devolución de llamada falla

Nota:
1. Al registrar mi solicitud con twitter, que proporcionan una llamada hipotética vuelta url: http://abz.xyc.com y establecer el tipo de aplicaciones como el navegador.
2. He proporcionado una url de devolución de llamada en mi código "myapp" y he agregado un filtro de intención para mi actividad con la categoría y el esquema de datos navegables como "myapp".
3. URL llamada cuando la autorización contiene la URL de devolución de llamada, especifiqué en el código.

¿Alguna idea de lo que estoy haciendo mal aquí?

código relevante:

public class FirstActivity extends Activity 
{ 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     OAuthAccessor client = defaultClient(); 
     Intent i = new Intent(Intent.ACTION_VIEW); 
     i.setData(Uri.parse(client.consumer.serviceProvider.userAuthorizationURL + "?oauth_token=" 
       + client.requestToken + "&oauth_callback=" + client.consumer.callbackURL)); 

     startActivity(i); 

    } 

    OAuthServiceProvider defaultProvider() 
    { 
     return new OAuthServiceProvider(GeneralRuntimeConstants.request_token_URL, 
       GeneralRuntimeConstants.authorize_url, GeneralRuntimeConstants.access_token_url); 
    } 

    OAuthAccessor defaultClient() 
    { 
     String callbackUrl = "myapp:///"; 
     OAuthServiceProvider provider = defaultProvider(); 
     OAuthConsumer consumer = new OAuthConsumer(callbackUrl, 
       GeneralRuntimeConstants.consumer_key, GeneralRuntimeConstants.consumer_secret, 
       provider); 
     OAuthAccessor accessor = new OAuthAccessor(consumer); 

     OAuthClient client = new OAuthClient(new HttpClient4()); 
     try 
     { 
      client.getRequestToken(accessor); 
     } catch (Exception e) 
     { 
      e.printStackTrace(); 
     } 

     return accessor; 
    } 

    @Override 
    protected void onResume() 
    { 
     // TODO Auto-generated method stub 
     super.onResume(); 

     Uri uri = this.getIntent().getData(); 
     if (uri != null) 
     { 
      String access_token = uri.getQueryParameter("oauth_token"); 
     } 
    } 

} 
// Manifest file 
<application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".FirstActivity" 
        android:label="@string/app_name"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
      <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="myapp"/> 
      </intent-filter> 
     </activity> 
</application> 

Respuesta

11

Twitter no respeta las devoluciones de llamada solicitadas en OAuth (Twitter API Announce) y solo redirigirá a la URL de devolución de llamada especificada en la Configuración de la aplicación (tenga en cuenta que "localhost" no está permitido).

Supongo que marcó Oauth-callback-on-android pregunta.

Android guesswork--
Después de un poco de lectura, veo navegador de Android redirige MiApl: /// para su aplicación y supongo Twitter no le gusta este prefijo URI medida. No soy un desarrollador de Android, pero una sugerencia que podría hacer es obtener "www.myapp.com" en la web y tener un redireccionamiento allí.

También lo han hecho su declaración de OAuth para http://www.myapp.com/redirect.aspx?oauth_token=abc y hacer que esa página redirigir a myapp:///oauth_token=... (el resultado deseado)

+0

Gracias por su respuesta. 1. Puede citar una referencia para su extracto: "Twitter no respeta las devoluciones de llamada solicitadas en OAuth y solo redirigirá a la URL de devolución de llamada especificada en la Configuración de la aplicación (tenga en cuenta que no se permite" localhost ")." 2. Sí, me hizo comprobar el Oauth-devolución de llamada-a-androide pregunta y haber puesto mi tipo de aplicación (es decir Browser) en consecuencia. Gracias de nuevo. – Samuh

+0

Agregado enlace a la API de Twitter anuncian. –

+0

Si las devoluciones de llamada solicitada por OAuth las solicitudes no se cumplen, ¿cómo puedo llamar a mi solicitud de autorización de publicación posterior? Twitter no acepta las URL de estilo Android, estas deben ser anuladas. ¿Cuáles son las alternativas si lo anterior no funciona? Por favor ayuda. [Obtendrá 10 puntos en este momento; 125 después de contestar esta última pregunta: P] – Samuh

0

A mi me parece que estás haciendo lo correcto y Twitter es meter la pata aceptando siempre la URL de devolución de llamada registrada. ¿Hay alguna forma de cambiar la URL registrada? Tal vez puedas volver a registrarte y probar una devolución de llamada de Android la próxima vez, mira lo que sucede.

+0

Sí, podemos cambiar la URL registrada haciendo clic en el botón EDITAR configuración de la aplicación. Probé dos conjuntos diferentes de URL sin mucha suerte, tal vez me vuelva a registrar y veremos qué sucede. – Samuh

+0

He vuelto a registrar mi aplicación sin ningún tipo de suerte ... – Samuh

3

En mi caso, tengo este trabajo:

String authURL = m_provider.retrieveRequestToken (m_consumer, CALLBACK_URL); 

Y en el Manifiesto:

<activity android:configChanges = "keyboardHidden|orientation" android:name = "xxxx.android.xxxxx"> 
     <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="myapp" android:host="tweet" /> 
     </intent-filter> 

En este caso, la URL de respuesta será: miaplicacion: // Tweet

+0

por favor dígame qué es myapp es el nombre de esta aplicación y qué escribir en lugar de twittear –

0

Mi problema era que estaba tratando de iniciar sesión con la misma cuenta que hice la aplicación de Twitter. Después de iniciar sesión con mi perfil personal, la devolución de llamada funciona (hasta ahora).

Cuestiones relacionadas