2012-06-13 3 views
0

[solved, mais je suis ouvert à de nouvelles suggestions ...]API Twitter retourne rappel invalide - ne peut pas autoriser

J'intégration Twitter dans mon application Android en utilisant twitter4j.

Lorsque je tente d'autoriser avec Twitter, je vous appelle le point final suivant avec mon jeton OAuth:

https://api.twitter.com/oauth/authenticate?oauth_token=MY_VALID_TOKEN

qui devrait me rediriger vers:

MY-CALLBACK:///?oauth_token=***&oauth_verifier=***

mais à la place, il me redirige vers:

https://api.twitter.comMY-CALLBACK///?oauth_token=***&oauth_verifier=***

qui est évidemment pas une URL valide.
(En outre, le : manque - il devrait être MY-CALLBACK:///...)

S'il vous plaît noter que je utilise WebView pour mes appels


je pouvais manipuler cette chaîne pour faire fonctionner le tout, mais il doit être une meilleure façon ...



Je passe mon URL de rappel à

getOAuthRequestToken("MY-CALLBACK:///");

et ont déjà défini le filtre intention de mon activité avec

<data android:scheme="x-oauthflow-twitter" />

En outre, l'activité a android:launchMode="singleInstance"



Qu'est-ce que je fais mal?


[modifier: plus de détails]

mTwitter = new TwitterFactory().getInstance(); 
mTwitter.setOAuthConsumer(Constants.TWITTER_CONSUMER_KEY, Constants.TWITTER_CONSUMER_SECRET); 

twitterWebView = new WebView(ActivityTwitterAuthorize.this); 

twitterWebView.setWebViewClient(new WebViewClient() { 

    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     if (url.startsWith(Constants.TWITTER_CALLBACK_URL)) { 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setData(Uri.parse(url)); 
      startActivity(intent); 

     // HACKY PART! 
     // I added the following code to force it to work, but this is a dirty hack... 
     // String TWITTER_CALLBACK_INVALID_PREFIX = "https://api.twitter.comx-oauthflow-twitter///"; 
     // TWITTER_CALLBACK_URL = "MY-CALLBACK:///"; 
     // BEGIN 
     } else if (url.startsWith(TWITTER_CALLBACK_INVALID_PREFIX)) { 
      url = url.substring(TWITTER_CALLBACK_INVALID_PREFIX.length()); 
      url = Constants.TWITTER_CALLBACK_URL + url; 
      Intent intent = new Intent(Intent.ACTION_VIEW); 
      intent.setData(Uri.parse(url)); 
      startActivity(intent); 
     // END 

     } else { 
      view.loadUrl(url); 
     } 
     return true; 
    } 

}); 

mTwitterReqToken = mTwitter.getOAuthRequestToken(Constants.TWITTER_CALLBACK_URL); 

twitterWebView.loadUrl(mTwitterReqToken.getAuthenticationURL()); 

sans la partie aki, ce code entraîne d'erreur "page Web non disponible", parce que l'URL est invalide:

https://api.twitter.comMY-CALLBACK///?oauth_token=***&oauth_verifier=***

Si l'url était MY-CALLBACK:///?oauth_token=***&oauth_verifier=*** alors mon activité recevrait une Intention, et tout irait bien ...

AVEC la partie "hacky", mon code fonctionne, mais je voudrais éviter ce morceau de code.

+0

S'il vous plaît donner plus de détails, je ne comprends pas votre problème. –

+0

vous devez fermer la boîte de dialogue WebView après avoir obtenu la condition if (url.startsWith (Constants.TWITTER_CALLBACK_URL)). –

+0

J'ai essayé cela aussi, mais même lorsque je tape 'https: //api.twitter.com/oauth/authenticate? Oauth_token = MY_VALID_TOKEN' dans mon navigateur, l'API Twitter retourne une adresse invalide ... –

Répondre

3

J'ai trouvé que je ne pouvais tout simplement pas le faire fonctionner de cette façon après avoir suivi les guides que j'ai vus en ligne.

J'ai fini par utiliser mon propre coutume WebViewClient avec le code:

if (url.contains("MY-CALLBACK:///")) 
{ 
    final int start = url.indexOf('?') + 1; 
    final String params = url.substring(start); 
    final String verifierToken = "oauth_verifier="; 
    if (params.contains(verifierToken)) 
    { 
     final int value = params.indexOf(verifierToken) + verifierToken.length(); 
     final String token = params.substring(value); 
     view.stopLoading();     
     authoriseNewUser(token); 
    } 
    else if (params.contains("denied")) 
    { 
     view.stopLoading(); 
     finish(); 
    } 
} 
else 
{ 
    view.loadUrl(url); 
} 
return true; 
+0

C'est en gros ce que j'ai fait aussi (vérifiez l'existence de mon URL de rappel dans l'url retournée et modifiez-la pour qu'elle corresponde au format attendu), mais y a-t-il un meilleur moyen? –

+0

En fait, je pense que je vais retravailler mon code pour utiliser quelque chose comme ça au lieu de diffuser des intentions ... C'est beaucoup plus efficace! Si personne ne propose une meilleure solution, j'accepte cette réponse. –

+1

C'est certainement la meilleure solution, j'ai enlevé le filtre d'intention tout à fait! Juste une suggestion pour vous, pour extraire les paramètres de requête de votre chaîne, vous pouvez utiliser 'Uri uri = Uri.parse (url); String oAuthVerifier = uri.getQueryParameter ("oauth_verifier"); if (oAuthVerifier! = null) {...} 'C'est plus joli que la chose url.substring() ... Merci! –

0

utilisation ci-dessous CallBack_URI pour cela, il peut vous aider.

public static final String OAUTH_CALLBACK_SCHEME = "x-oauthflow-twitter"; 
public static final String OAUTH_CALLBACK_HOST = "callback"; 
public static final String CALLBACK_URL = OAUTH_CALLBACK_SCHEME + "://" + OAUTH_CALLBACK_HOST; 
+0

Non, ce n'est pas le point. Il est parfaitement correct d'utiliser juste OAUTH_CALLBACK_SCHEME + ": ///" –

0
public static final String OAUTH_CALLBACK_SCHEME = "x-oauthflow-twitter"; 
public static final String OAUTH_CALLBACK_HOST = "litestcalback"; 
public static final String OAUTH_CALLBACK_URL = OAUTH_CALLBACK_SCHEME+ "://" +OAUTH_CALLBACK_HOST; 

utiliser ce type de callback_url dans le code et le fichier manifeste ...

+0

Ceci est la troisième réponse qui dit que mon URL de rappel est erronée. Non, mon URL de rappel n'est pas fausse. Je l'ai déjà essayé et c'est pareil que j'utilise SCHEME: // HOST ou juste SCHEME: /// –

+0

chère tu utilises SCHEME: // HOTE .... et essaye pour cela .... –

+0

J'ai essayé 'public static final String TWITTER_CALLBACK_URL = "x-oauthflow-twitter: ///"; 'et j'ai aussi essayé' public static final Chaîne TWITTER_CALLBACK_URL = "x-oauthflow-twitter: // callback"; '. Peu importe, ça ne marche pas de toute façon ... –

0

Je suppose qu'il n'y a rien de mal avec votre code. Je recevais le même résultat hier, mais aujourd'hui cela fonctionne comme un charme. C'est probablement un problème côté serveur. Pourriez-vous essayer à nouveau votre solution originale (sans partie hacky), pls?

+0

Je devinais que c'était le problème côté serveur. J'ai inclus le code pour traiter les deux cas, juste pour être du bon côté. J'écris pour me connecter quand la partie "hacky" est exécutée, donc je vais vérifier ça. Je vais vous faire savoir ces jours-ci ... –

Questions connexes