A vinculação de app baseado em OAuth (App Flip) abre seu app iOS em um app do Google para ajudar o usuário do Google app a vincular a conta com mais facilidade. Você precisa fazer pequenas alterações no código do seu aplicativo iOS para implementar esse recurso.
Neste documento, você vai aprender a modificar seu app iOS para que ele seja compatível com o App Flip.
Testar o exemplo
App de exemplo App Flip demonstra uma integração de vinculação de contas no iOS compatível com o App Flip. Você pode usar este app para verificar como responder a um App Flip universal recebido dos apps para dispositivos móveis do Google.
O app de exemplo está pré-configurado para integração com a App Flip Test Tool para iOS que você pode usar para verificar a integração do seu app iOS com o App Flip antes você configura a vinculação de contas com o Google. Este app simula o link universal acionada pelos apps para dispositivos móveis do Google quando o App Flip está ativado.
Como funciona
Confira a seguir as etapas de fluxo que o Google app e seu app seguem ao A virada de app ocorre:
O Google app tenta abrir o link universal do seu app. Ele é capaz de abrem o app se ele estiver instalado no dispositivo do usuário e associado a o link universal. Consulte Suporte a links universais para ver mais detalhes.
O app verifica se os parâmetros
client_id
eredirect_uri
estão codificados no URL de entrada corresponde ao link universal esperado do Google.O app solicita um código de autorização do servidor OAuth2. No fim desse fluxo, seu aplicativo retorna um código de autorização ou um erro para Google app. Para isso, ele abre o link universal do Google com anexos para o código de autorização ou erro.
O Google app processa o link universal recebido do Google e continua com o restante do fluxo. Se um código de autorização for fornecido, a vinculação será concluído imediatamente. A troca de tokens ocorre de servidor para servidor, no fluxo de vinculação do OAuth baseado no navegador. Se um código de erro for for retornado, o fluxo de vinculação continuará com as opções alternativas.
Modificar seu app iOS para oferecer suporte ao App Flip
Para oferecer suporte ao App Flip, faça as seguintes alterações de código no seu app iOS:
- Gerencie o
NSUserActivityTypeBrowsingWeb
no delegado do app. - Capture os parâmetros
redirect_uri
estate
do URL para usar depois. - 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
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 } }
Após a autorização, chame o URI de redirecionamento com a autorização o código-fonte. Use o exemplo de código a seguir:
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) } }
Se ocorrer um erro, anexe um resultado de erro ao URI de redirecionamento. Use o exemplo de código a seguir:
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) } }
Parâmetros de consulta para o link universal do seu app
Quando aberto pelo Google app, o link universal do seu app inclui o seguinte: parâmetros de consulta:
client_id
(String
): Googleclient_id
que está registrado no app.scope
(List of String
): uma lista de escopos separados por espaços solicitados.state
(String
): um valor de uso único usado pelo Google para verificar se a autorização resultado é uma resposta à solicitação enviada pelo Google.redirect_uri
(String
): link universal do Google. A "virada" URI a ser aberto o Google app e transmitir os resultados.
Parâmetros de consulta para o link universal do Google
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 recebido.
Parâmetros usados quando o resultado da autorização é retornado com falha:
error
(String
), com os seguintes valores:cancelled
: um erro recuperável. O Google app tentará usando o URL de autorização. Alguns exemplos são os casos de para fazer login, quando um dispositivo está off-line ou o tempo limite de uma conexão se esgotou.unrecoverable
: um erro irrecuperável. Por exemplo, o usuário tenta vincular com uma conta desativada.O Google app vai cancelar a vinculação da conta.invalid_request
: os parâmetros da solicitação são inválidos ou estão ausentes. Este é um erro recuperável. O Google app tentará vincular a conta usando o URL de autorização.access_denied
: o usuário recusa a solicitação de consentimento. Este é um erro não recuperável; o Google app cancela a vinculação.
error_description
(String
, opcional): é uma mensagem de erro fácil de usar.
Para todos os tipos de erro, você deve retornar os dados de resposta para o método
REDIRECT_URI
para garantir que o substituto apropriado seja acionado.
Modifique seu endpoint de autorização para oferecer suporte ao App Flip
Configure sua plataforma para aceitar solicitações usando os 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 Assistente
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 o URL especificado pelo parâmetro redirect_uri
correspondem aos valores esperados quando uma solicitação é recebida. se a verificação do cliente
falhar, retorne o erro invalid_request
ao redirect_uri
.