web-dev-qa-db-ja.com

OAuthおよびカスタムスキームの結果、Chrome

以前は問題なく機能していたので、何時間もこれに悩まされていましたが、予期したとおりに動作するために突然停止しました。何がどのように、なぜなのかはわかりません。何が問題なのかわからないまま、プロセスのすべてのコード行を再チェックしているので、皆さんに助けを求めています。

よし。ですから、ボタンをクリックして新しいIntent.ACTION_VIEWを開始するLoginScreenアクティビティがあります。これにより、ブラウザーでApiManager.OAUTH_CALLBACK_URIstjapp://oauthresponseに設定してOAUTHプロセスを開始します。

これがこのアクティビティのAndroidManifest.xmlの一部です。

<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>

アクティビティでIntent.ACTION_VIEWを開始する方法:

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);
        }
    };

そして、これはブラウザで何が起こるかのスクリーンショットです:

enter image description here

そこで、LoginScreenアクティビティに戻ってcodeクエリパラメータをonNewIntentメソッド内で処理することになっていますが、そうです。もう期待。

助けてくれてありがとう。

12
kytwb

これは Chromiumバグ のようです。私が使用している回避策は、PHP JavaScript経由でアプリを開くRedirectURIのランディングページです(このバグの影響を受けません):

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

同じエラーが発生し、URLの前にhttp://を付けることで解決しました。

4
Luis Armando

アドレスバーにリダイレクトページのURLを手動で入力している場合のみ。問題はここのクロム問題追跡システムにあります。

問題から貼り付けられた「回避策」を含む応答:

OK、インテントを介したwindow.locationリダイレクトが、ページ上の外部ソースまたはリンクからクリックされたときに動作することを発見しました。リダイレクトページのアドレスをアドレスバーに手動で入力すると、リダイレクト/アプリの起動が上記のエラーで失敗します。

そのため、リダイレクトページへのリンクを電子メールまたはSMSで送信すると、ユーザーがリンクをクリックすると正常に機能します。アドレスをアドレスバーに手動で入力すると失敗します。window.location = chromeUrl ;正常に動作するはずです。

2
Jayquon

Chromeバージョン40以降では、このバグが再び表面化しましたが、アドレスバーにリダイレクトページのURLを手動で入力している場合のみです。問題はchromiumの問題トラッカーにあります ここ

問題から貼り付けられた「回避策」を含む応答:

OK、インテントを介したwindow.locationリダイレクトが、ページ上の外部ソースまたはリンクからクリックされたときに動作することを発見しました。リダイレクトページのアドレスをアドレスバーに手動で入力すると、リダイレクト/アプリの起動が上記のエラーで失敗します。

そのため、リダイレクトページへのリンクを電子メールまたはSMSで送信すると、ユーザーがリンクをクリックすると正常に機能します。アドレスバーにアドレスを手動で入力すると失敗します。window.location = chromeUrl;は問題なく動作するはずです。

2
John Leehey