iOS のアプリ切り替え

OAuth ベースのアプリ切り替えリンク(アプリ切り替え)では、Google アプリから iOS アプリを開くことができます Google アプリユーザーがより簡単にアカウントをリンクできるようにしました。必要な この機能を実装するため、iOS アプリのコードを少し変更します。

このドキュメントでは、アプリ切り替えをサポートするように iOS アプリを変更する方法について説明します。

サンプルを試す

アプリ Flip のサンプルアプリ は、アプリ切り替えと互換性のある、iOS でのアカウント リンクの統合を示しています。 このアプリを使用すると、受信したアプリ切り替えユニバーサルへの応答方法を確認できます Google モバイルアプリからリンクできます。

サンプルアプリは、App Flip Test Tool for iOS、 これを使用して、事前に iOS アプリとアプリ切り替えとの統合を検証できます。 Google とのアカウントのリンクを設定します。このアプリはユニバーサル リンクをシミュレートします アプリ切り替えが有効な場合に、Google モバイルアプリによってトリガーされます。

仕組み

Google アプリとアプリが行うフローステップは次のとおりです。 アプリ切り替えが発生するタイミング:

  1. Google アプリがアプリのユニバーサル リンクを開こうとします。できること そのアプリがユーザーのデバイスにインストールされていて、 説明します。詳しくは、ユニバーサル リンクのサポートをご覧ください。

  2. client_idredirect_uri パラメータがエンコードされていることをアプリで確認 想定される Google ユニバーサル リンクと一致する。

  3. ご自身のアプリが OAuth2 サーバーからの認証コードをリクエストします。最後 このフローを実行すると、アプリから認証コードまたはエラーが クリックします。これを行うには、Google のユニバーサル リンクが開き、 認証コードまたはエラーのパラメータ。

  4. Google アプリが受信した Google ユニバーサル リンクを処理し、 できます。認証コードを指定すると、リンクが すぐに完了します。トークン交換はサーバー間で行われます。これは、 これはブラウザベースの OAuth リンクフローと同じです。エラーコードが 代替オプションを使用してリンクフローが続行されます。

アプリ切り替えをサポートするように iOS アプリを変更する

アプリ切り替えをサポートするには、iOS アプリのコードを次のように変更します。

  1. App Delegate で NSUserActivityTypeBrowsingWeb を処理します。
  2. 後で使用できるように、URL から redirect_uri パラメータと state パラメータを取得します。
  3. redirect_uri が次の形式と一致していることを確認します。
    https://oauth-redirect.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID
    https://oauth-redirect-sandbox.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID
  4. クライアント 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
        }
    }
    
  5. 認証に成功したら、認証でリダイレクト 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)
        }
    }
    
  6. エラーが発生した場合は、代わりにエラー結果をリダイレクト 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_idString): アプリで登録されている Google client_id
  • scopeList of String): リクエストされたスペース区切りのスコープのリスト。
  • stateString): 認証を検証するために Google が使用するノンス Google の送信リクエストに対するレスポンスであることがわかります。
  • redirect_uriString): Google のユニバーサル リンク。「フリップ」開く URI 結果を渡します。

認可結果が正常に返される場合に使用されるパラメータ:

  • codeString): 認証コードの値(利用可能な場合)。
  • stateString): 受信したユニバーサル リンクから受信した正確な値。

認可結果が返されなかった場合に使用されるパラメータ:

  • errorString)。次の値に置き換えます。

    • cancelled: 復元可能なエラー。Google アプリは、 認証 URL を使用してリンクできます。たとえば、ユーザーが失敗する ログインできない、デバイスがオフラインになっている、接続がタイムアウトするなどの問題が発生する可能性があります。
    • unrecoverable: 修復不可能なエラー。たとえば、ユーザーが無効なアカウントとリンクしようとした場合、Google アプリはアカウントのリンクを中止します。
    • invalid_request: リクエスト パラメータが無効であるか、存在しません。これは復元可能なエラーです。Google アプリは認証 URL を使用してアカウントのリンクを試みます。
    • access_denied: ユーザーが同意リクエストを拒否しました。これは修復不可能なエラーです。Google アプリがリンクを中止します。
  • error_descriptionString、省略可): わかりやすいエラー メッセージ。

どのエラータイプでも、レスポンス データを指定されたレスポンスに 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_idredirect_uri パラメータで指定された URL を確認する リクエストの受信時に期待値と一致することを確認します。確認プロセスが 失敗した場合は、エラー invalid_requestredirect_uri に返します。