Intégrer le Gestionnaire d'identifiants à la fonctionnalité Se connecter avec Google

Se connecter avec Google vous aide à intégrer rapidement l'authentification des utilisateurs à votre application Android. Les utilisateurs peuvent utiliser leur compte Google pour se connecter à votre application, donner leur autorisation et partager de manière sécurisée les informations de leur profil avec votre application. La bibliothèque Jetpack Gestionnaire d'identifiants d'Android rend cette intégration fluide, offrant une expérience cohérente sur tous les appareils Android à l'aide d'une seule API.

Ce document vous explique comment implémenter la fonctionnalité Se connecter avec Google dans les applications Android, comment configurer l'interface utilisateur du bouton "Se connecter avec Google" et comment configurer des expériences d'inscription et de connexion en un geste optimisées pour les applications. Pour une migration fluide des appareils, Se connecter avec Google est compatible avec la connexion automatique, et sa nature multiplate-forme sur les surfaces Android, iOS et Web vous aide à fournir un accès à votre application sur n'importe quel appareil.

Pour configurer la fonctionnalité Se connecter avec Google, suivez ces deux étapes principales:

Configurez l'option Se connecter avec Google en tant qu'option de l'interface utilisateur de la bottom sheet du Gestionnaire d'identifiants. Cette option peut être configurée pour inviter automatiquement l'utilisateur à se connecter. Si vous avez implémenté des clés d'accès ou des mots de passe, vous pouvez demander simultanément tous les types d'identifiants pertinents, afin que l'utilisateur n'ait pas à se souvenir de l'option qu'il a utilisée précédemment pour se connecter.

Bottom sheet du Gestionnaire d'identifiants
Figure 1. UI de sélection des identifiants de la bottom sheet du Gestionnaire d'identifiants

Ajoutez le bouton "Se connecter avec Google" à l'interface utilisateur de votre application. Le bouton "Se connecter avec Google" permet aux utilisateurs de s'inscrire ou de se connecter facilement à des applications Android à l'aide de leur compte Google existant. Les utilisateurs cliquent sur le bouton "Se connecter avec Google" s'ils ignorent l'interface utilisateur de la bottom sheet ou s'ils souhaitent explicitement utiliser leur compte Google pour s'inscrire et se connecter. Les développeurs peuvent ainsi intégrer plus facilement les utilisateurs et s'inscrire plus facilement.

Animation illustrant le flux "Se connecter avec Google"
Figure 2 : UI du bouton "Se connecter avec Google" dans le Gestionnaire d'identifiants

Ce document explique comment intégrer le bouton "Se connecter avec Google" et la boîte de dialogue bottom sheet avec l'API Gestionnaire d'identifiants à l'aide de la bibliothèque d'aide de l'ID Google.

Configurer votre projet dans la console Google APIs

  1. Ouvrez votre projet dans la console API ou créez-en un si vous n'en avez pas déjà un.
  2. Sur la page de l'écran de consentement OAuth, assurez-vous que toutes les informations sont complètes et exactes.
    1. Assurez-vous que le nom, le logo et la page d'accueil de votre application sont corrects. Ces valeurs seront présentées aux utilisateurs sur l'écran de consentement Se connecter avec Google lors de l'inscription et sur l'écran Applis et services tiers.
    2. Assurez-vous d'avoir indiqué les URL des règles de confidentialité et des conditions d'utilisation de votre application.
  3. Sur la page "Identifiants", créez un ID client Android pour votre application si vous n'en avez pas déjà un. Vous devez spécifier le nom de package et la signature SHA-1 de votre application.
    1. Accédez à la page Identifiants.
    2. Cliquez sur Créer des identifiants > ID client OAuth.
    3. Sélectionnez le type d'application Android.
  4. Sur la page "Identifiants", créez un ID client "Application Web", si ce n'est pas déjà fait. Vous pouvez ignorer les champs "Origines JavaScript autorisées" et "URI de redirection autorisés" pour le moment. Cet ID client permet d'identifier votre serveur backend lorsqu'il communique avec les services d'authentification de Google.
    1. Accédez à la page Identifiants.
    2. Cliquez sur Créer des identifiants > ID client OAuth.
    3. Sélectionnez le type d'application Web.

Déclarer des dépendances

Dans le fichier build.gradle de votre module, déclarez les dépendances à l'aide de la dernière version du Gestionnaire d'identifiants:

dependencies {
  // ... other dependencies

  implementation "androidx.credentials:credentials:<latest version>"
  implementation "androidx.credentials:credentials-play-services-auth:<latest version>"
  implementation "com.google.android.libraries.identity.googleid:googleid:<latest version>"
}

Instancier une requête Google Sign-In

Pour commencer l'implémentation, instanciez une requête Google Sign-In. Utilisez GetGoogleIdOption pour récupérer le jeton d'ID Google d'un utilisateur.

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(WEB_CLIENT_ID)
  .setAutoSelectEnabled(true)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

Tout d'abord, vérifiez si l'utilisateur possède un compte ayant déjà été utilisé pour se connecter à votre application. Pour ce faire, appelez l'API avec le paramètre setFilterByAuthorizedAccounts défini sur true. Les utilisateurs peuvent choisir de se connecter à un autre compte.

Si aucun compte Google autorisé n'est disponible, l'utilisateur doit être invité à s'inscrire avec l'un de ses comptes disponibles. Pour ce faire, invitez l'utilisateur à appeler à nouveau l'API et à définir setFilterByAuthorizedAccounts sur false. En savoir plus sur l'inscription

Activer la connexion automatique pour les utilisateurs connus (recommandé)

Les développeurs doivent activer la connexion automatique pour les utilisateurs qui s'inscrivent avec un compte unique. Cela offre une expérience fluide sur tous les appareils, en particulier lors de la migration, où les utilisateurs peuvent rapidement récupérer l'accès à leur compte sans saisir à nouveau leurs identifiants. Pour vos utilisateurs, cela élimine les frictions inutiles lorsqu'ils étaient déjà connectés.

Pour activer la connexion automatique, utilisez setAutoSelectEnabled(true). La connexion automatique n'est possible que si les critères suivants sont remplis:

  • Un seul identifiant correspond à la requête, qui peut être un compte Google ou un mot de passe. Cet identifiant correspond au compte par défaut sur l'appareil Android.
  • L'utilisateur ne s'est pas explicitement déconnecté.
  • L'utilisateur n'a pas désactivé la connexion automatique dans les paramètres de son compte Google.
val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(WEB_CLIENT_ID)
  .setAutoSelectEnabled(true)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

N'oubliez pas de gérer correctement la déconnexion lorsque vous implémentez la connexion automatique, afin que les utilisateurs puissent toujours choisir le bon compte après s'être explicitement déconnectés de votre application.

Définir un nonce pour améliorer la sécurité

Pour améliorer la sécurité de la connexion et éviter les attaques par rejeu, ajoutez setNonce pour inclure un nonce dans chaque requête. Découvrez comment générer un nonce.

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(true)
  .setServerClientId(WEB_CLIENT_ID)
  .setAutoSelectEnabled(true)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

Créer le parcours Se connecter avec Google

Pour configurer un flux de connexion avec Google, procédez comme suit :

  1. Instanciez GetCredentialRequest et ajoutez le googleIdOption créé précédemment pour récupérer les identifiants.
  2. Transmettez cette requête à l'appel getCredential() (Kotlin) ou getCredentialAsync() (Java) pour récupérer les identifiants de l'utilisateur disponibles.
  3. Une fois l'API établie, extrayez CustomCredential, qui contient le résultat des données GoogleIdTokenCredential.
  4. Le type de CustomCredential doit être égal à la valeur de GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL. Convertissez l'objet en GoogleIdTokenCredential à l'aide de la méthode GoogleIdTokenCredential.createFrom.
  5. Si la conversion aboutit, extrayez l'ID GoogleIdTokenCredential, validez-le et authentifiez les identifiants sur votre serveur.

  6. Si la conversion échoue avec une erreur GoogleIdTokenParsingException, vous devrez peut-être mettre à jour la version de votre bibliothèque Se connecter avec Google.

  7. Récupérez tous les types d'identifiants personnalisés non reconnus.

val request: GetCredentialRequest = Builder()
  .addGetCredentialOption(googleIdOption)
  .build()

coroutineScope.launch {
  try {
    val result = credentialManager.getCredential(
      request = request,
      context = activityContext,
    )
    handleSignIn(result)
  } catch (e: GetCredentialException) {
    handleFailure(e)
  }
}

fun handleSignIn(result: GetCredentialResponse) {
  // Handle the successfully returned credential.
  val credential = result.credential

  when (credential) {

    // Passkey credential
    is PublicKeyCredential -> {
      // Share responseJson such as a GetCredentialResponse on your server to
      // validate and authenticate
      responseJson = credential.authenticationResponseJson
    }

    // Password credential
    is PasswordCredential -> {
      // Send ID and password to your server to validate and authenticate.
      val username = credential.id
      val password = credential.password
    }

    // GoogleIdToken credential
    is CustomCredential -> {
      if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
        try {
          // Use googleIdTokenCredential and extract id to validate and
          // authenticate on your server.
          val googleIdTokenCredential = GoogleIdTokenCredential
            .createFrom(credential.data)
        } catch (e: GoogleIdTokenParsingException) {
          Log.e(TAG, "Received an invalid google id token response", e)
        }
      } else {
        // Catch any unrecognized custom credential type here.
        Log.e(TAG, "Unexpected type of credential")
      }
    }

    else -> {
      // Catch any unrecognized credential type here.
      Log.e(TAG, "Unexpected type of credential")
    }
  }
}

Déclencher un flux avec le bouton "Se connecter avec Google"

Pour déclencher le flux du bouton "Se connecter avec Google", utilisez GetSignInWithGoogleOption au lieu de GetGoogleIdOption:

val signInWithGoogleOption: GetSignInWithGoogleOption = GetSignInWithGoogleOption.Builder()
  .setServerClientId(WEB_CLIENT_ID)
  .setNonce(<nonce string to use when generating a Google ID token>)
  .build()

Gérez le GoogleIdTokenCredential renvoyé comme décrit dans l'exemple de code suivant.

fun handleSignIn(result: GetCredentialResponse) {
  // Handle the successfully returned credential.
  val credential = result.credential

  when (credential) {
    is CustomCredential -> {
      if (credential.type == GoogleIdTokenCredential.TYPE_GOOGLE_ID_TOKEN_CREDENTIAL) {
        try {
          // Use googleIdTokenCredential and extract id to validate and
          // authenticate on your server.
          val googleIdTokenCredential = GoogleIdTokenCredential
            .createFrom(credential.data)
        } catch (e: GoogleIdTokenParsingException) {
          Log.e(TAG, "Received an invalid google id token response", e)
        }
      }
      else -> {
        // Catch any unrecognized credential type here.
        Log.e(TAG, "Unexpected type of credential")
      }
    }

    else -> {
      // Catch any unrecognized credential type here.
      Log.e(TAG, "Unexpected type of credential")
    }
  }
}

Une fois que vous avez instancié la requête de connexion Google, lancez le flux d'authentification comme indiqué dans la section Se connecter avec Google.

Activer l'inscription des nouveaux utilisateurs (recommandé)

Se connecter avec Google est le moyen le plus simple pour les utilisateurs de créer un compte avec votre application ou votre service en quelques gestes.

Si aucun identifiant enregistré n'est trouvé (aucun compte Google renvoyé par getGoogleIdOption), invitez votre utilisateur à s'inscrire. Tout d'abord, vérifiez si setFilterByAuthorizedAccounts(true) pour voir s'il existe des comptes précédemment utilisés. Si aucun compte n'est trouvé, invitez l'utilisateur à s'inscrire avec son compte Google à l'aide de setFilterByAuthorizedAccounts(false).

Exemple :

val googleIdOption: GetGoogleIdOption = GetGoogleIdOption.Builder()
  .setFilterByAuthorizedAccounts(false)
  .setServerClientId(SERVER_CLIENT_ID)
  .build()

Après avoir instancié la requête d'inscription Google, lancez le processus d'authentification. Si les utilisateurs ne souhaitent pas s'inscrire auprès de Google, envisagez d'utiliser des services de saisie automatique ou des clés d'accès pour créer un compte.

Gérer la déconnexion

Lorsqu'un utilisateur se déconnecte de votre application, appelez la méthode API clearCredentialState() pour effacer l'état actuel des identifiants utilisateur de tous les fournisseurs d'identifiants. Tous les fournisseurs d'identifiants seront informés que toute session d'identifiants stockée pour l'application donnée doit être effacée.

Un fournisseur d'identifiants peut avoir stocké une session active d'identifiants et l'utiliser pour limiter les options de connexion lors des futurs appels get-credential. Par exemple, il peut donner la priorité au jeu d'identification actif par rapport à tout autre identifiant disponible. Lorsque l'utilisateur se déconnectera explicitement de votre application et que vous obtiendrez les options de connexion globales la prochaine fois, vous devrez appeler cette API pour permettre au fournisseur d'effacer toute session d'identifiants stockée.