web-dev-qa-db-fra.com

OAuth et le schéma personnalisé entraînent un "ERR_UNknown_URL_SCHEME" dans Chrome

Je suis coincé là-dessus depuis des heures maintenant que la chose fonctionnait auparavant, mais je me suis soudain arrêté pour me comporter comme prévu. Je ne sais pas vraiment comment et pourquoi car j'ai revérifié chaque ligne de code dans le processus sans être en mesure de voir ce qui ne va pas, alors je vous demande de l'aide.

Bien. J'ai donc une activité LoginScreen avec un bouton démarrant une nouvelle Intent.ACTION_VIEW sur clic. Cela démarre le processus OAUTH dans le navigateur avec un ApiManager.OAUTH_CALLBACK_URI mis à stjapp://oauthresponse.

Voici mon AndroidManifest.xml partie pour cette activité:

<activity
    Android:name=".LoginScreen"
    Android:label="@string/application"
    Android:launchMode="singleTask">
    <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="stjapp" Android:Host="oauthresponse" />
    </intent-filter>
</activity>

Comment je démarre le Intent.ACTION_VIEW dans mon activité:

private View.OnClickListener loginHandler = new View.OnClickListener() {
        public void onClick(View v) {
             OAuthClientRequest request = null;
             try {
                request = OAuthClientRequest
                    .authorizationLocation(ApiManager.OAUTH_AUTHORIZE)
                    .setClientId(ApiManager.CLIENT_ID).setRedirectURI(ApiManager.OAUTH_CALLBACK_URI)
                    .buildQueryMessage();
            } 
            catch (OAuthSystemException e) { e.printStackTrace(); } 
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(request.getLocationUri() + "&response_type=code"));
            startActivity(intent);
        }
    };

Et voici une capture d'écran de ce qui se passe dans le navigateur:

enter image description here

Là, je suis censé revenir à mon activité LoginScreen et gérer les paramètres de requête code dans la méthode onNewIntent mais ... oui, la chose ne fonctionne pas comme plus attendu.

Toute aide appréciée.

12
kytwb

Il semble que ce soit un bug de chrome . La solution de contournement que j'utilise est une page de destination PHP pour le RedirectURI qui ouvre l'application via JavaScript (qui n'est pas affectée par ce bogue):

<script language="javascript">
    window.location = 'myscheme://myhost/?<?=$_SERVER["QUERY_STRING"]?>';
</script>
7
domsom

J'ai eu la même erreur et je l'ai résolue en préfixant l'url avec http://.

4
Luis Armando

uniquement si vous saisissez manuellement l'URL de la page de redirection dans la barre d'adresse. Le problème est sur le tracker de problème de chrome ici.

La réponse avec la "solution de contournement", collée à partir du problème:

OK, j'ai découvert que la redirection window.location via l'intention fonctionnera, COMME LONGUEMENT car elle est cliquée à partir d'une source externe ou d'un lien sur la page. Si vous entrez manuellement l'adresse de la page de redirection dans la barre d'adresse, la redirection/ouverture de l'application échouera avec cette erreur.

Ainsi, l'envoi d'un lien vers la page de redirection dans un e-mail ou SMS fonctionnera très bien lorsque l'utilisateur cliquera sur le lien. La saisie manuelle de l'adresse dans la barre d'adresse échouera. Window.location = chromeUrl ; devrait fonctionner très bien.

2
Jayquon

Dans Chrome version 40 et plus, ce bogue a refait surface, mais uniquement si vous entrez manuellement l'URL de la page de redirection dans la barre d'adresse. Le problème est sur le tracker de problème de chrome ici .

La réponse avec la "solution de contournement", collée à partir du problème:

OK, j'ai découvert que la redirection window.location via l'intention fonctionnera, COMME LONGUEMENT car elle est cliquée à partir d'une source externe ou d'un lien sur la page. Si vous entrez manuellement l'adresse de la page de redirection dans la barre d'adresse, la redirection/ouverture de l'application échouera avec cette erreur.

Ainsi, l'envoi d'un lien vers la page de redirection dans un e-mail ou SMS fonctionnera très bien lorsque l'utilisateur cliquera sur le lien. La saisie manuelle de l'adresse dans la barre d'adresse échouera. window.location = chromeUrl; devrait très bien fonctionner.

2
John Leehey