Приложение Flip для iOS

Связывание App Flip на основе OAuth (App Flip) открывает ваше приложение iOS из приложения Google, чтобы пользователю приложения Google было проще связать свою учетную запись. Чтобы реализовать эту функцию, вам необходимо внести незначительные изменения в код вашего приложения iOS.

В этом документе вы узнаете, как изменить приложение iOS для поддержки App Flip.

Попробуйте образец

Пример приложения App Flip демонстрирует интеграцию привязки учетной записи в iOS, совместимую с App Flip. Вы можете использовать это приложение, чтобы проверить, как реагировать на входящую универсальную ссылку App Flip из мобильных приложений Google.

Пример приложения предварительно настроен для интеграции с App Flip Test Tool для iOS , который вы можете использовать для проверки интеграции вашего приложения iOS с App Flip, прежде чем настраивать привязку учетной записи к Google. Это приложение имитирует универсальную ссылку, активируемую мобильными приложениями Google, когда включен App Flip.

Как это работает

Ниже приведены этапы процесса, которые приложение Google и ваше приложение выполняют, когда происходит переворот приложения:

  1. Приложение Google пытается открыть универсальную ссылку вашего приложения. Он может открыть ваше приложение, если оно установлено на устройстве пользователя и связано с универсальной ссылкой. Подробности см. в разделе «Поддержка универсальных ссылок» .

  2. Ваше приложение проверяет, что параметры client_id и redirect_uri , закодированные во входящем URL-адресе, соответствуют ожидаемой универсальной ссылке Google.

  3. Ваше приложение запрашивает код авторизации с вашего сервера OAuth2. В конце этого процесса ваше приложение возвращает приложению Google либо код авторизации, либо ошибку. Для этого он открывает универсальную ссылку Google с добавленными параметрами кода авторизации или ошибки.

  4. Приложение Google обрабатывает входящую универсальную ссылку Google и продолжает выполнение остальной части процесса. Если указан код авторизации, привязка выполняется немедленно. Обмен токенами происходит между серверами так же, как и в процессе связывания OAuth на основе браузера. Если возвращается код ошибки, процесс связывания продолжается с альтернативными вариантами.

Измените свое приложение для iOS, чтобы оно поддерживало App Flip.

Чтобы поддержать App Flip, внесите следующие изменения кода в свое приложение iOS:

  1. Обработайте NSUserActivityTypeBrowsingWeb в делегате приложения.
  2. Захватите параметры redirect_uri и state из URL-адреса, чтобы использовать их позже.
  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. Убедитесь, что идентификатор клиента соответствует ожидаемому значению. Используйте следующий пример кода:

    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_id ( String ): Google client_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 , чтобы обеспечить запуск соответствующего резервного варианта.

Измените конечную точку авторизации для поддержки App Flip.

Настройте свою платформу для приема запросов с использованием URL-адресов перенаправления Google App Flip:

  • Приложение 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 и URL-адрес, указанный параметром redirect_uri , соответствуют ожидаемым значениям при получении запроса. если проверка клиента не удалась, верните ошибку invalid_request в redirect_uri .