App Flip para iOS

A vinculação do App Flip com base em OAuth (App Flip) abre seu aplicativo iOS a partir de um aplicativo do Google para ajudar o usuário do aplicativo do Google a vincular sua conta com mais facilidade. Você precisa fazer pequenas alterações no código do seu aplicativo iOS para implementar esse recurso.

Neste documento, você aprende como modificar seu aplicativo iOS para oferecer suporte ao App Flip.

Experimente a amostra

O aplicativo de amostra App Flip demonstra uma integração de vinculação de contas no iOS compatível com o App Flip. Você pode usar este aplicativo para verificar como responder a um link universal do App Flip recebido de aplicativos móveis do Google.

O aplicativo de amostra é pré-configurado para integração com a ferramenta de teste App Flip para iOS , que você pode usar para verificar a integração do seu aplicativo iOS com o App Flip antes de configurar o vínculo de conta com o Google. Este aplicativo simula o link universal acionado por aplicativos móveis do Google quando o App Flip está ativado.

Como funciona

A seguir estão as etapas do fluxo que o Google app e seu aplicativo realizam quando ocorre o App Flip:

  1. O Google app tenta abrir o link universal do seu app. É capaz de abrir seu aplicativo se estiver instalado no dispositivo do usuário e associado ao link universal. Consulte Suporte a links universais para obter detalhes.

  2. Seu aplicativo verifica se os parâmetros client_id e redirect_uri codificados no URL de entrada correspondem ao link universal do Google esperado.

  3. Seu aplicativo solicita um código de autorização de seu servidor OAuth2. No final deste fluxo, seu aplicativo retorna um código de autorização ou um erro para o Google app. Para fazer isso, ele abre o link universal do Google com parâmetros anexados para o código de autorização ou erro.

  4. O Google app lida com o link universal de entrada do Google e continua com o resto do fluxo. Se um código de autorização for fornecido, o link será concluído imediatamente. A troca de token ocorre de servidor para servidor, da mesma forma que no fluxo de vinculação OAuth baseado em navegador. Se um código de erro for retornado, o fluxo de vinculação continuará com as opções alternativas.

Modifique seu aplicativo iOS para oferecer suporte ao App Flip

Para oferecer suporte ao App Flip, faça as seguintes alterações de código em seu aplicativo iOS:

  1. Manipule NSUserActivityTypeBrowsingWeb em seu App Delegate.
  2. Capture redirect_uri e parâmetros de state da URL para usar mais tarde.
  3. Verifique se redirect_uri corresponde a este formato:
    https://oauth-redirect.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID
    https://oauth-redirect-sandbox.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID
  4. Verifique se o ID do cliente corresponde ao valor esperado. Use o seguinte exemplo de código:

    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. Após a autorização bem-sucedida, chame o URI de redirecionamento com o código de autorização. Use o seguinte exemplo de código:

    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. Se ocorrer um erro, anexe um resultado de erro ao URI de redirecionamento. Use o seguinte exemplo de código:

    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)
        }
    }
    

Quando aberto pelo Google app, o link universal do seu aplicativo inclui os seguintes parâmetros de consulta:

  • client_id ( String ): client_id Google que está registrado em seu aplicativo.
  • scope ( List of String ): Uma lista de escopos separados por espaço solicitados.
  • state ( String ): Um nonce usado pelo Google para verificar se o resultado da autorização é uma resposta à solicitação de saída do Google.
  • redirect_uri ( String ): link universal do Google. O URI "flip" para abrir o Google app e passar os resultados.

Parâmetros usados ​​quando o resultado da autorização é retornado com sucesso:

  • code ( String ): O valor do código de autorização, se disponível.
  • state ( String ): O valor exato recebido do link universal de entrada.

Parâmetros usados ​​quando o resultado da autorização é retornado sem sucesso:

  • error ( String ), com os seguintes valores:

    • cancelled : um erro recuperável. O Google app tentará vincular contas usando o URL de autorização. Alguns exemplos são falha do usuário ao fazer login, dispositivo off-line ou tempo limite de conexão esgotado.
    • unrecoverable : o Google app aborta a vinculação de contas. Por exemplo, uma conta desativada ou autorização negada impede a vinculação de contas.
    • invalid_request : Os parâmetros da solicitação são inválidos ou ausentes.
  • error_description ( String , opcional): Uma mensagem de erro amigável.

Modifique seu endpoint de autorização para oferecer suporte ao App Flip

Configure sua plataforma para aceitar solicitações usando URLs de redirecionamento do App Flip do Google:

  • App 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
    
  • App Google Assistant
    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
    

Verifique se client_id e a URL especificada pelo parâmetro redirect_uri correspondem aos valores esperados quando uma solicitação é recebida.