Restez organisé à l'aide des collections
Enregistrez et classez les contenus selon vos préférences.
L'association de retour d'application basée sur OAuth permet d'ouvrir votre application iOS à partir d'une application Google
pour aider l'utilisateur de l'appli Google à associer plus facilement son compte. Vous devez faire en sorte
modifications mineures du code de votre application iOS afin d'implémenter cette fonctionnalité.
Dans ce document, vous découvrirez comment modifier votre application iOS pour qu'elle prenne en charge App Flip.
Essayer l'exemple
Application exemple App Flip
illustre une intégration d'association de compte compatible avec App Flip sur iOS.
Vous pouvez utiliser cette appli pour vérifier comment répondre à un App Flip universel entrant
des applis mobiles Google.
L'application exemple est préconfigurée pour s'intégrer à l'outil de test de retournement d'application pour
iOS
que vous pouvez utiliser pour vérifier l'intégration de votre application iOS avec App Flip avant
vous configurez l'association de comptes avec Google. Cette application simule le lien universel.
déclenché par les applis mobiles Google
lorsque App Flip est activé.
Fonctionnement
Voici la procédure à suivre par l'appli Google et votre application lorsque
Une rotation d'application se produit:
L'appli Google tente d'ouvrir le lien universel de votre application. Il est capable de
ouvrir votre application si elle est installée sur l'appareil de l'utilisateur et associée à
le lien universel. Pour en savoir plus, consultez la section Compatibilité avec les liens universels.
Votre application vérifie que les paramètres client_id et redirect_uri sont encodés
de l'URL entrante correspond au lien universel Google attendu.
Votre application demande un code d'autorisation à votre serveur OAuth2. À la fin
de ce flux, votre application renvoie un code d'autorisation ou une erreur
l'appli Google. Pour cela, elle ouvre le lien universel de Google avec
pour le code d'autorisation ou l'erreur.
L'appli Google gère le lien universel Google entrant et poursuit :
le reste du flux. Si un code d'autorisation est fourni, l'association est
terminée immédiatement. L'échange de jetons se fait de serveur à serveur,
dans le flux d'association OAuth
basé sur un navigateur. Si un code d'erreur est
le flux d'association continue avec les autres options.
Modifier votre application iOS pour qu'elle prenne en charge App Flip
Pour prendre en charge App Flip, apportez les modifications de code suivantes à votre application iOS:
Gérez NSUserActivityTypeBrowsingWeb dans votre délégué d'application.
Capturez les paramètres redirect_uri et state à partir de l'URL pour les utiliser ultérieurement.
Vérifiez que redirect_uri correspond au format suivant:
Une fois l'autorisation obtenue, appelez l'URI de redirection avec l'autorisation
du code source. Utilisez l'exemple de code suivant:
funcreturnAuthCode(code:String,state:String,redirectUri:String){varredirectURL=URL(string:redirectUri)varcomponents=URLComponents(url:redirectURL,resolvingAgainstBaseURL:false)// Return the authorization code and original stateletparamAuthCode=URLQueryItem(name:"code",value:code)letparamState=URLQueryItem(name:"state",value:state)components?.queryItems=[paramAuthCode,paramState]ifletresultURL=components?.url{UIApplication.shared.open(resultURL,options:[UIApplicationOpenURLOptionUniversalLinksOnly:true],completionHandler:nil)}}
Si une erreur s'est produite, joignez un résultat d'erreur à l'URI de redirection.
Utilisez l'exemple de code suivant:
funcreturnError(redirectUri:String){varredirectURL=URL(string:redirectUri)varcomponents=URLComponents(url:redirectURL,resolvingAgainstBaseURL:false)// Return the authorization code and original stateletparamError=URLQueryItem(name:"error",value:"invalid_request")letparamDescription=URLQueryItem(name:"error_description",value:"Invalid Request")components?.queryItems=[paramError,paramDescription]ifletresultURL=components?.url{UIApplication.shared.open(resultURL,options:[UIApplicationOpenURLOptionUniversalLinksOnly:true],completionHandler:nil)}}
Paramètres de requête pour le lien universel de votre application
Lorsque l'appli Google l'ouvre, le lien universel de votre application inclut les éléments suivants :
paramètres de requête:
client_id (String): client_id Google enregistré sous votre appli.
scope (List of String): liste des champs d'application demandés, séparés par un espace.
state (String): nonce utilisé par Google pour vérifier que l'autorisation
en réponse à la requête sortante de Google.
redirect_uri (String): lien universel de Google. La partie "flip" URI à ouvrir
l'appli Google et de transmettre les résultats.
Paramètres de requête pour le lien universel de Google
Paramètres utilisés lorsque le résultat de l'autorisation est correctement renvoyé:
code (String): valeur du code d'autorisation, si disponible.
state (String): valeur exacte reçue du lien universel entrant.
Paramètres utilisés lorsque le résultat de l'autorisation n'est pas renvoyé:
error (String), avec les valeurs suivantes:
cancelled: erreur récupérable. L'appli Google va tenter de créer
à l'aide de l'URL d'autorisation. Par exemple, si l'utilisateur n'arrive pas
pour se connecter, un appareil est hors connexion ou une connexion a expiré.
unrecoverable: erreur irrécupérable. Par exemple, l'utilisateur tente de s'associer à un compte désactivé.L'appli Google annulera l'association du compte.
invalid_request: les paramètres de requête sont incorrects ou manquants. Il s'agit d'une erreur récupérable. L'appli Google tentera d'associer le compte à l'aide de l'URL d'autorisation.
access_denied: l'utilisateur refuse la demande de consentement. Il s'agit d'une erreur non récupérable. l'appli Google annule l'association.
Pour tous les types d'erreurs, vous devez renvoyer les données de réponse à la
REDIRECT_URI pour que la création de remplacement appropriée soit déclenchée.
Modifiez votre point de terminaison d'autorisation pour qu'il soit compatible avec App Flip
Configurez votre plate-forme pour accepter les requêtes à l'aide des URL de redirection App Flip de Google:
Vérifiez que client_id et l'URL spécifiée par le paramètre redirect_uri
correspondre aux valeurs attendues lorsqu'une requête est reçue. si la validation du client
échoue, renvoyez l'erreur invalid_request à redirect_uri.
Sauf indication contraire, le contenu de cette page est régi par une licence Creative Commons Attribution 4.0, et les échantillons de code sont régis par une licence Apache 2.0. Pour en savoir plus, consultez les Règles du site Google Developers. Java est une marque déposée d'Oracle et/ou de ses sociétés affiliées.
Dernière mise à jour le 2025/07/25 (UTC).
[null,null,["Dernière mise à jour le 2025/07/25 (UTC)."],[[["\u003cp\u003eOAuth-based App Flip linking simplifies account linking for Google app users by enabling them to seamlessly open your iOS app for authorization.\u003c/p\u003e\n"],["\u003cp\u003eTo support App Flip, you need to modify your iOS app to handle universal links, validate incoming parameters, and return authorization codes or errors to the Google app.\u003c/p\u003e\n"],["\u003cp\u003eYour authorization endpoint must be configured to accept Google's App Flip redirect URLs and perform client verification for incoming requests.\u003c/p\u003e\n"],["\u003cp\u003eThe App Flip sample app and test tool provide a practical demonstration and verification environment for your iOS app's integration with App Flip.\u003c/p\u003e\n"]]],[],null,["OAuth-based App Flip linking (App Flip) opens your iOS app from a Google app\nto help the Google app user link their account more easily. You need to make\nminor code changes to your iOS app to implement this feature.\n\nIn this document, you learn how to modify your iOS app to support App Flip.\n\nTry the sample\n\nThe App Flip [sample app](https://github.com/googlesamples/identity-appflip-ios)\ndemonstrates an account linking integration on iOS that's App Flip-compatible.\nYou can use this app to verify how to respond to an incoming App Flip universal\nlink from Google mobile apps.\n\nThe sample app is preconfigured to integrate with the [App Flip Test Tool for\niOS](https://github.com/googlesamples/identity-appflip-tester-ios),\nwhich you can use to verify your iOS app's integration with App Flip before\nyou configure account linking with Google. This app simulates the universal link\ntriggered by Google mobile apps when App Flip is enabled.\n\nHow it works\n\nThe following are the flow steps that the Google app and your app take when\nApp Flip occurs:\n\n1. The Google app attempts to open your app's universal link. It's able to\n open your app if it's installed on the user's device and associated with\n the universal link. See [Supporting Universal Links](https://developer.apple.com/documentation/uikit/inter-process_communication/allowing_apps_and_websites_to_link_to_your_content) for details.\n\n2. Your app checks that the `client_id` and `redirect_uri` parameter encoded\n in the incoming URL matches the expected Google universal link.\n\n3. Your app requests an authorization code from your OAuth2 server. At the end\n of this flow, your app returns either an authorization code or an error to\n the Google app. To do this, it opens Google's universal link with appended\n parameters for the authorization code or error.\n\n4. The Google app handles the incoming Google universal link and continues with\n the rest of the flow. If an authorization code is provided, the linking is\n completed immediately. The token exchange happens server-to-server, the same\n way it does in the browser-based OAuth linking flow. If an error code is\n returned, the linking flow continues with the alternative options.\n\nModify your iOS app to support App Flip\n\nTo support App Flip, make the following code changes to your iOS app:\n\n1. Handle `NSUserActivityTypeBrowsingWeb` in your App Delegate.\n2. Capture `redirect_uri` and `state` parameters from the URL to use later.\n3. Check that `redirect_uri` matches this format: \n\n ```\n https://oauth-redirect.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID\n https://oauth-redirect-sandbox.googleusercontent.com/a/GOOGLE_APP_BUNDLE_ID\n ```\n4. Verify that the client ID matches the expected value. Use the following\n code sample:\n\n func application(_ application: UIApplication,\n continue userActivity: NSUserActivity,\n restorationHandler: @escaping ([Any]?) -\u003e Void) -\u003e Bool\n {\n guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,\n let incomingURL = userActivity.webpageURL,\n let components = URLComponents(url: incomingURL, resolvingAgainstBaseURL: false),\n let params = components.queryItems else {\n return false\n }\n\n if let clientId = params.filter({$0.name == \"client_id\"}).first?.value,\n let state = params.filter({$0.name == \"state\"}).first?.value,\n let redirectUri = params.filter({$0.name == \"redirect_uri\"}).first?.value {\n\n // Save the redirect_uri and state for later...\n\n // Verify the client id\n return (clientId == GOOGLE_CLIENT_ID)\n } else {\n // Missing required parameters\n return false\n }\n }\n\n5. Upon successful authorization, call the redirect URI with the authorization\n code. Use the following code sample:\n\n func returnAuthCode(code: String, state: String, redirectUri: String) {\n var redirectURL = URL(string: redirectUri)\n var components = URLComponents(url: redirectURL, resolvingAgainstBaseURL: false)\n\n // Return the authorization code and original state\n let paramAuthCode = URLQueryItem(name: \"code\", value: code)\n let paramState = URLQueryItem(name: \"state\", value: state)\n components?.queryItems = [paramAuthCode, paramState]\n if let resultURL = components?.url {\n UIApplication.shared.open(\n resultURL,\n options: [UIApplicationOpenURLOptionUniversalLinksOnly : true],\n completionHandler: nil)\n }\n }\n\n6. If an error occurred, attach an error result to the redirect URI instead.\n Use the following code sample:\n\n **Note:** Do not handle the error directly within your app, instead return the error result to the `REDIRECT_URL`. This ensures that the appropriate fallback method is trigerred if the app linking flow fails. \n\n func returnError(redirectUri: String) {\n var redirectURL = URL(string: redirectUri)\n var components = URLComponents(url: redirectURL, resolvingAgainstBaseURL: false)\n\n // Return the authorization code and original state\n let paramError = URLQueryItem(name: \"error\", value: \"invalid_request\")\n let paramDescription = URLQueryItem(name: \"error_description\", value: \"Invalid Request\")\n components?.queryItems = [paramError, paramDescription]\n if let resultURL = components?.url {\n UIApplication.shared.open(\n resultURL,\n options: [UIApplicationOpenURLOptionUniversalLinksOnly : true],\n completionHandler: nil)\n }\n }\n\nQuery parameters for your app's universal link\n\nWhen opened by the Google app, your app's universal link includes the following\nquery parameters:\n\n- `client_id` (`String`): Google `client_id` that's registered under your app.\n- `scope` (`List of String`): A list of space-separated scopes requested.\n- `state` (`String`): A nonce used by Google to verify that the authorization result is in response to Google's outgoing request.\n- `redirect_uri` (`String`): Google's universal link. The \"flip\" URI to open the Google app and pass results.\n\nQuery parameters for Google's universal link\n\nParameters used when the authorization result is returned successfully:\n\n- `code` (`String`): The value of the authorization code, if available.\n- `state` (`String`): The exact value received from the incoming universal link.\n\nParameters used when the authorization result is returned unsuccessfully:\n\n- `error` (`String`), with the following values:\n\n - `cancelled`: A recoverable error. The Google app will attempt account linking using the authorization URL. Some examples are the user failing to sign in, a device being offline or a connection timing out.\n - `unrecoverable`: An unrecoverable error. For example, the user attempts to link with a disabled account.The Google app will abort account linking.\n - `invalid_request`: The request parameters are invalid or missing. This is a recoverable error. The Google app will attempt account linking using the authorization URL.\n - `access_denied`: The user rejects the consent request. This is a non-recoverable error; the Google app aborts linking.\n- `error_description` (`String`, optional): A user-friendly error message.\n\n | **Note:** For more information on [possible errors](https://www.oauth.com/oauth2-servers/server-side-apps/possible-errors/) and the optional contents of the `error_description` field, see the OAuth 2.0 standard.\n\nFor all error types, you must return the response data to the specified\n`REDIRECT_URI` to ensure the appropriate fallback is trigerred.\n\nModify your authorization endpoint to support App Flip\n\nConfigure your platform to accept requests using Google's App Flip redirect URLs:\n\n- Google Home app \n\n ```\n https://oauth-redirect.googleusercontent.com/a/com.google.Chromecast.dev\n https://oauth-redirect.googleusercontent.com/a/com.google.Chromecast.enterprise\n https://oauth-redirect.googleusercontent.com/a/com.google.Chromecast\n https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.Chromecast.dev\n https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.Chromecast.enterprise\n https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.Chromecast\n ```\n- Google Assistant app \n\n ```\n https://oauth-redirect.googleusercontent.com/a/com.google.OPA.dev\n https://oauth-redirect.googleusercontent.com/a/com.google.OPA.enterprise\n https://oauth-redirect.googleusercontent.com/a/com.google.OPA\n https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA.dev\n https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA.enterprise\n https://oauth-redirect-sandbox.googleusercontent.com/a/com.google.OPA\n ```\n\nCheck that `client_id` and the URL specified by the `redirect_uri` parameter\nmatch the expected values when a request is received. if the client verification\nfails, return the error `invalid_request` to the `redirect_uri`."]]