OAuth ベースのアプリ切り替えリンク(アプリ切り替え)では、Google アプリから iOS アプリを開くことができます Google アプリユーザーがより簡単にアカウントをリンクできるようにしました。必要な この機能を実装するため、iOS アプリのコードを少し変更します。
このドキュメントでは、アプリ切り替えをサポートするように iOS アプリを変更する方法について説明します。
サンプルを試す
アプリ Flip のサンプルアプリ は、アプリ切り替えと互換性のある、iOS でのアカウント リンクの統合を示しています。 このアプリを使用すると、受信したアプリ切り替えユニバーサルへの応答方法を確認できます Google モバイルアプリからリンクできます。
サンプルアプリは、App Flip Test Tool for iOS、 これを使用して、事前に iOS アプリとアプリ切り替えとの統合を検証できます。 Google とのアカウントのリンクを設定します。このアプリはユニバーサル リンクをシミュレートします アプリ切り替えが有効な場合に、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 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
client_id
と redirect_uri
パラメータで指定された URL を確認する
リクエストの受信時に期待値と一致することを確認します。確認プロセスが
失敗した場合は、エラー invalid_request
を redirect_uri
に返します。