web-dev-qa-db-ja.com

ChromeカスタムタブからAndroid app

ログインウィジェットを「近代化」してChromeカスタムタブを Googleは数か月以内にWebviewsを使用したリクエストのブロックを開始しますOAuth

ログインウィジェットは、Google/Facebook/...の認証コードフローでOAuth2「クライアント」を再生することにより、従来の「ユーザー名とパスワード」ログインとソーシャルログインをサポートするIDサービスと連携します。したがって、Googleからの認証コードがこれに配信されます。 Identity Serviceは、ログインウィジェットにアクセストークンを提供します。

アクセストークンは、クライアント側のリダイレクトを介してモバイルアプリに返されます。

window.location.replace('com.acmeusercontent.tenants.abc:\/setTokenData?accessToken='+access_token+'#');

従来のログインに適しています。ユーザーがユーザー名とパスワードを入力して送信すると、アクセストークンが返され、カスタムURIスキームへのリダイレクトにより、RedirectReceiverActivityのインテントフィルターがトリガーされます。

ただし、ソーシャルログインの場合、Android Monitor:のこの行を除いて、リダイレクトでは何も起こりません。

I/chromium: [INFO:CONSOLE(0)] "Navigation is blocked: com.acmeusercontent.tenants.abc:/setTokenData..."

明確にするために、クラシックログインとソーシャルログインの両方で、クライアント側のリダイレクトはまったく同じですが、クラシックログインの後は許可され、ソーシャルログインの後はブロックされます!!また、ソーシャルログイン後にまったく同じリダイレクトを行うボタンをウィジェットに追加すると、ユーザーがクリックしている限り、再び許可されます。

これは私を困惑させます:-リダイレクトが時々許可され、時々ブロックされるのはなぜですか? -ソーシャルログインシーケンスの終了後にユーザーにボタンをクリックするように求める以外に、これを回避する方法はありますか?

「intent:」構文の使用、コードからのボタンのクリックのシミュレーション、サーバー側のリダイレクトの使用など、考えられるすべてのことを試しましたが、何も機能しません。また、Google認証の例で AppAuthライブラリ を調べましたが、私が知る限り、まったく同じことをしています。

12
Free Willaert

私はAppAuthの主任メンテナーです。

アプリへのリダイレクトをトリガーするためのChrome側)のポリシーは、カスタムスキームまたはhttps App Link のいずれを使用する場合でも、このアクションはユーザーがトリガーする必要があるというものです。 、Javascriptではありません。ここでの意図は、リンクをクリックするという形での明示的な「同意」なしにサイトがアプリケーションを開いた場合のユーザーの驚きを防ぐことだと思います。

これは、承認リクエストでリダイレクトURIにすぐにリダイレクトするIDプロバイダーにとって問題です。カスタムタブを開いてからリダイレクトするまでの間にアクションは発生しません。

OAuthリダイレクトをキャプチャし、ユーザーがここをクリックした後にアプリに転送する方法を示すデモを維持しています。

https://github.com/iainmcgin/AppAuth-Demo

もう1つの潜在的なオプションは、バックエンドでリダイレクトパラメータをキャプチャしてから、カスタムスキームへの302リダイレクトでブラウザに応答することです。これはユーザーアクションからの単一のリダイレクト「チェーン」を維持するため、これを許可する必要があります。残念ながら、これははるかに複雑です。アプリのリダイレクトが行われた後、サーバーからパラメーターを取得するためのキーとしてOAuth2状態パラメーターを使用する必要がある可能性が高いためです。 AppAuthは、承認応答がブラウザーから直接提供されることを期待しているため、これを直接支援することはできません。

12
iainmcgin