OAuth 2.0 を実装すると、OAuth ベースの App Flip を設定できるようになります。これを使うと、デベロッパーの認証システムに登録されている iOS ユーザーのアカウントを、そのユーザーの Google アカウントに簡単にリンクできます。以降のセクションでは、iOS での Cloud-to-cloud 統合用に App Flip を設計して実装する方法について説明します。
設計ガイドライン
このセクションでは、App Flip のアカウント リンクの同意画面の設計要件と推奨事項について説明します。Google がアプリを呼び出すと、アプリはユーザーに同意画面を表示します。
要件
- 「リンクすると、Google はデバイスを操作する権限を取得します。」などの Google 認証ステートメントが必要です。
- ユーザーのアカウントが Google にリンクされることを伝える必要があります。Google Home や Google アシスタントなどの特定の Google サービスにリンクされるのではないことを伝える必要があります。
- 同意画面に明確な行動を促すフレーズを記載し、リンク アクションには「同意してリンク」という文言を使用する必要があります。これは、アカウントをリンクするために Google と共有する必要があるデータをユーザーが理解する必要があるためです。
- ユーザーがリンクしないことを選択した場合、ユーザーが戻ったり、拒否したり、キャンセルしたりする方法を提供する必要があります。キャンセル アクションには「キャンセル」という文言を使用します。
- このワークフローを実装する必要があります。つまり、[同意してリンク] をクリックした後、リンクが成功したことを表示し、ユーザーを Google Home アプリに自動的にリダイレクトする必要があります。これで、ユーザーの Google Home アプリに、リンクされたデバイスとアクションが表示されます。[キャンセル] をクリックしたら、ユーザーを Google Home アプリにリダイレクトする必要があります。
推奨事項
次のことをおすすめします。
Google のプライバシー ポリシーを表示します。同意画面に Google のプライバシー ポリシーへのリンクを含めます。
共有されるデータ。明確で簡潔な表現を使用して、Google がユーザーのどのデータを必要としているか、またその理由をユーザーに伝えます。
リンクを解除できること。ユーザーがリンクを解除できる仕組み(プラットフォームのアカウント設定への URL など)を提供します。または、ユーザーがリンクされたアカウントを管理できる Google アカウントへのリンクを含めることもできます。
ユーザー アカウントを変更する機能。ユーザーがアカウントを切り替える方法を提案します。これは、ユーザーが複数のアカウントを持っている場合に特に便利です。
- ユーザーがアカウントを切り替えるために同意画面を閉じる必要がある場合は、回復可能なエラーを Google に送信して、ユーザーが OAuth リンクとインプリシット フローを使用して目的のアカウントにログインできるようにします。
ロゴを含めます。同意画面に会社のロゴを表示します。スタイル ガイドラインに沿ってロゴを配置します。Google のロゴも表示する場合は、ロゴと商標をご覧ください。
OAuth ベースの App Flip を設定する
以下のセクションでは、OAuth ベースのアプリ切り替えの前提条件と、アプリ切り替えプロジェクトを Google Home Developer Console で設定する方法について説明します。
Cloud-to-cloud 統合を作成して OAuth 2.0 サーバーを設定する
App Flip を構成する前に、次のことを行う必要があります。
- OAuth 2.0 サーバーを設定する。OAuth サーバーの設定について詳しくは、OAuth 2.0 サーバーを実装するをご覧ください。
- Cloud-to-cloud 統合を作成する。統合を作成するには、Cloud-to-cloud 統合を作成するの手順に沿って操作します。
Developer Console でアプリ切り替えを設定する
次のセクションでは、Developer Console でアプリ切り替えを構成する方法を説明します。
- [OAuth Client information] のすべてのフィールドを入力します(App Flip がサポートされていない場合は、通常の OAuth がフォールバックとして使用されます)。
- [Use your app for account linking(optional)] で、[Enable for iOS](iOS で有効にする)をオンにします。
- [Universal Link](ユニバーサル リンク)フィールドに入力します。ユニバーサル リンクについて詳しくは、コンテンツへのアプリとウェブサイトのリンクを許可するをご覧ください。
- クライアントを設定したい場合は、スコープを追加し、[Configure your client (optional)](クライアントを構成する(省略可))で [Add scope](スコープを追加)をクリックします。
- [保存] をクリックします。
次のセクションでは、iOS アプリに App Flip を実装します。
ネイティブ アプリに App Flip を実装する
App Flip を実装するには、Google からのディープリンクを許可するようにアプリのユーザー認可コードを変更する必要があります。
OAuth ベースのアプリ切り替えリンク(アプリ切り替え)を使用すると、Google アプリから iOS アプリを開いて、Google アプリのユーザーがアカウントをより簡単にリンクできるようになります。この機能を実装するには、iOS アプリのコードを少し変更する必要があります。
このドキュメントでは、アプリ切り替えをサポートするように iOS アプリを変更する方法について説明します。
サンプルを試す
App Flip サンプルアプリは、アプリ切り替えに対応した iOS でのアカウント リンクの統合を示しています。このアプリを使用すると、Google モバイルアプリから受信したアプリ切り替えユニバーサル リンクへの応答方法を検証できます。
サンプルアプリは、iOS 用 App Flip テストツールと統合するように事前構成されています。このツールを使用すると、Google とのアカウント リンクを設定する前に、iOS アプリとアプリ切り替えの統合を検証できます。このアプリは、アプリ切り替えが有効になっているときに Google モバイルアプリによってトリガーされるユニバーサル リンクをシミュレートします。
仕組み
アプリ切り替えが発生したときに Google アプリとアプリが実行するフローの手順は次のとおりです。
Google アプリは、アプリのユニバーサル リンクを開こうとします。ユーザーのデバイスにインストールされ、ユニバーサル リンクに関連付けられているアプリを開くことができます。詳しくは、ユニバーサル リンクのサポートをご覧ください。
アプリは、受信 URL でエンコードされた
client_idパラメータとredirect_uriパラメータが、想定される Google ユニバーサル リンクと一致することを確認します。ご自身のアプリが OAuth2 サーバーからの認証コードをリクエストします。このフローの最後に、アプリは認可コードまたはエラーを Google アプリに返します。これを行うには、認可コードまたはエラーのパラメータを追加して Google のユニバーサル リンクを開きます。
Google アプリは、受信した Google ユニバーサル リンクを処理し、残りのフローを続行します。認証コードが提供されると、リンクはすぐに完了します。トークンの交換は、ブラウザベースの OAuth リンクフローと同じように、サーバー間で行われます。エラーコードが返された場合、リンクフローは代替オプションで続行されます。
アプリ切り替えをサポートするように iOS アプリを変更する
アプリ切り替えをサポートするには、iOS アプリのコードを次のように変更します。
- App Delegate で
NSUserActivityTypeBrowsingWebを処理します。 - 後で使用するために、URL から
redirect_uriパラメータとstateパラメータをキャプチャします。 redirect_uriが次の形式と一致していることを確認します。https://oauth-redirect.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID https://oauth-redirect-sandbox.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID
クライアント ID が想定される値と一致することを確認します。次のコードサンプルを使用します。
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([Any]?) -> Void) -> Bool { guard userActivity.activityType == NSUserActivityTypeBrowsingWeb, let incomingURL = userActivity.webpageURL, let components = URLComponents(url: incomingURL, resolvingAgainstBaseURL: false), let params = components.queryItems else { return false } if let clientId = params.filter({$0.name == "client_id"}).first?.value, let state = params.filter({$0.name == "state"}).first?.value, let redirectUri = params.filter({$0.name == "redirect_uri"}).first?.value { // Save the redirect_uri and state for later... // Verify the client id return (clientId == GOOGLE_CLIENT_ID) } else { // Missing required parameters return false } }認可が成功したら、認可コードを使用してリダイレクト URI を呼び出します。次のコードサンプルを使用します。
func returnAuthCode(code: String, state: String, redirectUri: String) { var redirectURL = URL(string: redirectUri) var components = URLComponents(url: redirectURL, resolvingAgainstBaseURL: false) // Return the authorization code and original state let paramAuthCode = URLQueryItem(name: "code", value: code) let paramState = URLQueryItem(name: "state", value: state) components?.queryItems = [paramAuthCode, paramState] if let resultURL = components?.url { UIApplication.shared.open( resultURL, options: [UIApplicationOpenURLOptionUniversalLinksOnly : true], completionHandler: nil) } }エラーが発生した場合は、代わりにエラー結果をリダイレクト URI に追加します。次のコードサンプルを使用します。
func returnError(redirectUri: String) { var redirectURL = URL(string: redirectUri) var components = URLComponents(url: redirectURL, resolvingAgainstBaseURL: false) // Return the authorization code and original state let paramError = URLQueryItem(name: "error", value: "invalid_request") let paramDescription = URLQueryItem(name: "error_description", value: "Invalid Request") components?.queryItems = [paramError, paramDescription] if let resultURL = components?.url { UIApplication.shared.open( resultURL, options: [UIApplicationOpenURLOptionUniversalLinksOnly : true], completionHandler: nil) } }
アプリのユニバーサル リンクのクエリ パラメータ
Google アプリによって開かれると、アプリのユニバーサル リンクには次のクエリ パラメータが含まれます。
client_id(String): アプリに登録されている Googleclient_id。scope(List of String): リクエストされたスコープのスペース区切りのリスト。state(String): 承認結果が Google の送信リクエストに対する応答であることを確認するために Google が使用するノンス。redirect_uri(String): Google のユニバーサル リンク。Google アプリを開いて結果を渡す「フリップ」URI。
Google のユニバーサル リンクのクエリ パラメータ
承認結果が正常に返されたときに使用されるパラメータ:
code(String): 認証コードの値(利用可能な場合)。state(String): 受信したユニバーサル リンクから取得された正確な値。
承認結果が失敗として返された場合に使用されるパラメータ:
error(String)。次の値を使用します。cancelled: 回復可能なエラー。Google アプリは、認可 URL を使用してアカウントのリンクを試みます。たとえば、ユーザーがログインに失敗した場合、デバイスがオフラインの場合、接続がタイムアウトした場合などです。unrecoverable: 修復不可能なエラー。たとえば、ユーザーが無効なアカウントにリンクしようとした場合、Google アプリはアカウントのリンクを中止します。invalid_request: リクエスト パラメータが無効であるか、指定されていません。これは回復可能なエラーです。Google アプリは、認証 URL を使用してアカウントのリンクを試みます。access_denied: ユーザーが同意リクエストを拒否した。これは回復不能なエラーです。Google アプリはリンクを中止します。
error_description(String、省略可): ユーザー フレンドリーなエラー メッセージ。
すべてのエラータイプで、指定された REDIRECT_URI にレスポンス データを返して、適切なフォールバックがトリガーされるようにする必要があります。
アプリ切り替えをサポートするように認可エンドポイントを変更する
Google のアプリ切り替えリダイレクト URL を使用してリクエストを受け入れるようにプラットフォームを構成します。
- Google Home アプリ
https://oauth-redirect.googleusercontent.com/a/com.google.Chromecast.dev https://oauth-redirect.googleusercontent.com/a/com.google.Chromecast.enterprise https://oauth-redirect.googleusercontent.com/a/com.google.Chromecast https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.Chromecast.dev https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.Chromecast.enterprise https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.Chromecast
- Google アシスタント アプリ
https://oauth-redirect.googleusercontent.com/a/com.google.OPA.dev https://oauth-redirect.googleusercontent.com/a/com.google.OPA.enterprise https://oauth-redirect.googleusercontent.com/a/com.google.OPA https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA.dev https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA.enterprise https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA
Google Home app (GHA) の場合、スマートホーム アカウントのリンクでは com.google.Chromecast リダイレクト URL が使用されます。認可サーバーでこれらのリダイレクト URL が許可されていることを確認してください。
リクエストの受信時に、client_id と redirect_uri パラメータで指定された URL が想定値と一致することを確認します。クライアントの検証に失敗した場合は、エラー invalid_request を redirect_uri に返します。
デバイスで App Flip をテストする
Cloud-to-cloud 統合を作成し、コンソールとアプリでアプリ切り替えを設定したら、モバイル デバイスでアプリ切り替えをテストできます。Google Home アプリを使用してアプリ切り替えをテストできます。
Google Home アプリから App Flip をテストする手順は次のとおりです。
- Developer Console に移動して、プロジェクトを選択します。
- [Cloud-to-cloud] > [Test] に移動します。
- Home アプリからアカウントのリンクフローをトリガーします。
- Google Home app (GHA) を開きます。
- [+] ボタンをクリックします。
- [デバイスのセットアップ] をクリックします。
- [セットアップ済みデバイスのリンク] をクリックします。
- プロバイダのリストから、Cloud-to-cloud 統合を選択します。リストの先頭に「[test]」が付きます。リストから [test] 統合を選択する場合、アプリを開く必要があります。
- アプリが起動したことを確認し、承認フローのテストを開始します。