Comment gérer les rappels d'URL OAuth avec les filtres Intent si l'authentification est effectuée avec Webview?
Je développe une application qui utilise OAuth pour l'authentification, mais j'ai un petit problème de gestion d'authentification OAuth pour les rappels.
L'AUTHENTIFICATION
Mon application a un webview que l'écran de connexion et je suis une url pour charger le formulaire d'autorisation dans mon webview. Disons que l'url est :
https://myoauthhost.com/oauth/auth?response_type=code&client_id=XXXXXXX&redirect_uri=YYYYYYYY&scope=ZZZZZZZZZZ
et dans la auth activité (AuthActivity.java), j'ai le texte suivant :
String authURL = https://myoauthhost.com/oauth/auth?response_type=code&client_id=XXXXXXX&redirect_uri=YYYYYYYY&scope=ZZZZZZZZZZ
myWebView.loadUrl(authURL);
dans le manifest.xml, j'ai le texte suivant pour oauth rappel de la manipulation :
<activity
android:name=".AuthActivity"
android:label="@string/app_name"
android:screenOrientation="portrait" >
<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:host="authprovider"
android:scheme="auth" />
</intent-filter>
</activity>
LE PROBLÈME
Cette url utilisée dans la webview (avec loadURL ()) redirige vers une autre url qui contient le RÉEL OAUTH WEB DE (qui doit être chargé dans la webview). Le problème est que cette redirection lance automatiquement le intention de sélection dans Android : depuis l'URL doit être manipulé par un navigateur web, Android vous permet de choisir le navigateur web du téléphone pour ouvrir l'url.
Puisque ce n'est pas ce que je veux, je dois inclure le code suivant pour que la redirection est géré à l'intérieur de la webview, mais ne pas lancer un navigateur web (ou autre) :
myWebView.setWebViewClient(new WebViewClient());
donc, avec ce code, la redirection est géré "dans la webview" et j'ai l'écran de connexion affiche.
Je peux ensuite entrez les informations d'identification (e.g : via oauth de Twitter), mais lorsque l'authentification est réalisée, le retour d'appel est reçu, mais l'activité qui est censé gérer le rappel (AuthActivity configuré pour recevoir de rappel dans le manifeste) n'est pas lancé. Au lieu de cela, j'ai la webview l'affichage d'un message disant que l'url de callback (dans notre cas : authprovider://auth/XXX?xxx=yyy, tel que défini dans le manifeste) ne peut pas être trouvé.
La raison peut être que le code suivant :
myWebView.setWebViewClient(new WebViewClient());
présenté plus tôt, raconte Android que la webview s'occupe de tout. Alors maintenant, depuis l'url de callback n'est pas une url de site web, il a de la difficulté à manipuler et ne peut même pas lancer l'intention qui peut s'en occuper.
LA QUESTION
Comment puis-je résoudre ce problème ?
Je devrais être en mesure de laisser l'activité de gérer le rappel, mais ne pas laisser la webview essayer de le charger.
toute aide serait appréciée
merci d'avance
source d'informationauteur kaffein
Vous devez vous connecter pour publier un commentaire.
Tout d'abord dans votre manifeste, définissez les propriétés de votre activité qui lance la WebView
et ajouter un filtre d'intention à qui que
ensuite dans votre code lorsque l'utilisateur clique sur le bouton connexion
Ici l'url de callback est
private static final String CALLBACK_URL = "oauth-testing:///";
et vous êtes la création d'une dynamique webview et d'afficher à l'utilisateur. Et après la connexion dans la webview est fermé et le code provient de la
onNewIntent()
. Vous avez besoin pour mettre en œuvre votre fonctionnalité après la connexion.Je sais que j'ai rajouté de l'extrait de code, dont certains pourraient ne pas être pertinents, mais j'espère que ça va aider quelqu'un un jour.
Bien, vous pouvez avoir besoin d'appeler l'URL qui vous est fourni par votre fournisseur de services, si il n'y a aucune redirection existe pas, vous obtiendrez le code d'état HTTP 3xx. Ensuite, vous pouvez essayer d'appeler l'URL réelle si il n'y a aucune redirection existe pas. Pour normal de la réponse HTTP, vous obtiendrez HTTP 2xx code d'état.