OAuth ベースのアプリ切り替えリンク(アプリ切り替え)では、Google アプリから iOS アプリを開くことができます Google アプリユーザーがより簡単にアカウントをリンクできるようにしました。必要な この機能を実装するため、iOS アプリのコードを少し変更します。
このドキュメントでは、アプリ切り替えをサポートするように iOS アプリを変更する方法について説明します。
サンプルを試す
アプリ Flip のサンプルアプリ は、アプリ切り替えと互換性のある、iOS でのアカウント リンクの統合を示しています。 このアプリを使用すると、Google モバイルアプリから受信したアプリ切り替えのユニバーサル リンクにどのように応答するかを確認できます。
サンプルアプリは、iOS 用アプリ切り替えテストツールと統合するように事前構成されています。このツールを使用すると、Google とのアカウントのリンクを構成する前に、iOS アプリとアプリ切り替えの統合を確認できます。このアプリは、アプリ切り替えが有効になっているときに Google モバイルアプリによってトリガーされるユニバーサル リンクをシミュレートします。
仕組み
Google アプリとアプリが行うフローステップは次のとおりです。 アプリ切り替えが発生するタイミング:
Google アプリがアプリのユニバーサル リンクを開こうとします。できること そのアプリがユーザーのデバイスにインストールされていて、 説明します。詳しくは、ユニバーサル リンクのサポートをご覧ください。
client_idとredirect_uriパラメータがエンコードされていることをアプリで確認 想定される Google ユニバーサル リンクと一致する。ご自身のアプリが OAuth2 サーバーからの認証コードをリクエストします。最後 このフローを実行すると、アプリから認証コードまたはエラーが クリックします。これを行うには、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 のユニバーサル リンク。「フリップ」開く 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.rc 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.rc 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.rc 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.rc https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA
client_id と redirect_uri パラメータで指定された URL を確認する
リクエストの受信時に期待値と一致することを確認します。確認プロセスが
失敗した場合は、エラー invalid_request を redirect_uri に返します。