Intégration auth0-net-android
Ajoutez l'authentification Auth0 aux applications .NET Android. Cette skill intègre le package NuGet Auth0.OidcClient.AndroidX qui utilise Chrome Custom Tabs pour des flux de connexion et déconnexion OIDC sécurisés avec PKCE.
Instruction d'agent : Avant de fournir les instructions de configuration du SDK, récupérez la dernière version de release en exécutant :
gh api repos/auth0/auth0-oidc-client-net/releases --jq '[.[] | select(.tag_name | startswith("androidx-")) | .tag_name | ltrimstr("androidx-")] | .[0]'Utilisez la version retournée dans toutes les lignes de dépendance au lieu de la version en dur ci-dessous.
Prérequis
- .NET 8.0 SDK ou version ultérieure
- Visual Studio 2022 (17.8+) avec la charge de travail .NET Android, ou JetBrains Rider
- Android SDK API 21+ (minimum), API 34+ recommandé pour net9.0-android
- Compte Auth0 avec une application Native configurée
- Node.js 20+ (pour la configuration automatisée via Auth0 CLI)
Quand NE PAS utiliser
| Cas d'usage | Skill recommandée |
|---|---|
| Application .NET MAUI multi-plateforme (iOS + Android + Windows) | auth0-maui |
| Application .NET iOS uniquement | auth0-net-ios |
| Application Android uniquement en Kotlin | auth0-android |
| Application web serveur ASP.NET Core | auth0-aspnetcore-authentication |
| Web API ASP.NET Core (validation JWT) | auth0-aspnetcore-api |
| Application mobile React Native | auth0-react-native |
Flux de démarrage rapide
Instruction d'agent : Avant de commencer, examinez le projet de l'utilisateur :
- Identifiez la version .NET depuis le fichier
.csproj(TargetFramework)- Vérifiez les implémentations d'authentification existantes — recherchez les gestionnaires de connexion/déconnexion existants et intégrez-vous à eux si trouvés (réutilisez les éléments d'interface existants comme les boutons de connexion plutôt que de créer des doublons)
- Notez l'espace de noms du projet et le nom du package depuis le
.csprojouAndroidManifest.xml- Cherchez les utilisations existantes de
Auth0ClientouAuth0ClientOptionspour éviter une configuration dupliquée
- Installez le SDK :
dotnet add package Auth0.OidcClient.AndroidX - Configurez Auth0 : Voir le Guide de configuration pour une configuration automatique ou manuelle.
- Intégrez l'authentification : Ajoutez l'instantiation de
Auth0Client, configurez l'IntentFiltersur votre Activity, et connectez la connexion/déconnexion aux actions de l'interface. - Gérez le callback : Surchargez
OnNewIntentet appelezActivityMediator.Instance.Send(intent.DataString)pour finaliser le flux d'authentification. - Compilez et vérifiez :
dotnet build
Instruction d'agent : Lors de la rédaction de la configuration Auth0Client :
- Passez
this(l'Activity) comme deuxième argument au constructeurAuth0Client.- Définissez toujours
Scope = "openid profile email offline_access"— la portéeoffline_accessest nécessaire pour recevoir les tokens de rafraîchissement, permettant le renouvellement silencieux des tokens sans redemander à l'utilisateur.- Le format de l'URL de callback est
YOUR_ANDROID_PACKAGE_NAME://YOUR_AUTH0_DOMAIN/android/YOUR_ANDROID_PACKAGE_NAME/callback— tout en minuscules.- Le
DataSchemedans l'IntentFilterdoit être en minuscules ou Android ne recevra pas les callbacks.- Définez
LaunchMode = LaunchMode.SingleTasksur l'Activity pour éviter les instances dupliquées. N'utilisez PASSingleTop— cela ne gère pas correctement la redirection de callback et créera des instances d'Activity dupliquées.- L'Activity doit soit étendre
Auth0ClientActivitySOIT surcharger manuellementOnNewIntentet appelerActivityMediator.Instance.Send(intent.DataString).- Stockez les tokens de manière sécurisée : Après une connexion réussie, persistez
AccessTokenetRefreshTokenen utilisantSecureStorage(MAUI/Essentials) ouEncryptedSharedPreferences(AndroidX Security — nécessitedotnet add package Xamarin.AndroidX.Security.SecurityCrypto). Ne stockez jamais les tokens dansSharedPreferencesen clair ou uniquement dans des variables en mémoire.Après avoir écrit la configuration et le code, vérifiez que la compilation réussit :
dotnet buildSi la compilation échoue, tentez de corriger le problème. Après 5-6 tentatives échouées, demandez de l'aide à l'utilisateur.
WebAuth — Fonctionnement de l'authentification
Le SDK utilise le motif WebAuth via Chrome Custom Tabs (le navigateur système). Quand LoginAsync() est appelé, le SDK :
- Construit l'URL
/authorizeavec les paramètres PKCE - Ouvre Chrome Custom Tabs avec l'URL d'autorisation
- Après authentification, Auth0 redirige vers l'URL de callback native
- Le système Android fait correspondre le schéma d'URL et le fournit à votre Activity via
OnNewIntent ActivityMediatorfinalise l'échange de tokens
C'est le flux standard OAuth 2.0 Authorization Code avec PKCE, recommandé pour les applications mobiles natives.
Configuration de l'URL de callback
L'URL de callback native pour .NET Android utilise le nom du package comme schéma. Le format est :
YOUR_ANDROID_PACKAGE_NAME://YOUR_AUTH0_DOMAIN/android/YOUR_ANDROID_PACKAGE_NAME/callback
Où YOUR_ANDROID_PACKAGE_NAME est le nom du package pour votre application, tel que com.mycompany.myapplication. Par exemple : com.mycompany.myapp://tenant.us.auth0.com/android/com.mycompany.myapp/callback.
Remarque : Certains SDK natifs Auth0 utilisent
https://{domain}/android/{package}/callbackcomme format d'URL de callback. Le SDK .NET Android utilise le nom du package comme schéma d'URL à la place.
Assurez-vous que l'URL de callback est en minuscules.
Cette URL doit être :
- Enregistrée dans le tableau de bord Auth0 sous Allowed Callback URLs et Allowed Logout URLs
- Appairée par les attributs
IntentFilter(DataScheme,DataHost,DataPathPrefix) sur votre Activity
Fait quand
- [ ] Package
Auth0.OidcClient.AndroidXinstallé (dernière version stable) - [ ]
Auth0Clientconfiguré avec Domain, ClientId etScope = "openid profile email offline_access" - [ ]
IntentFilterconfiguré sur Activity avec DataScheme, DataHost, DataPathPrefix corrects - [ ]
LaunchMode = LaunchMode.SingleTaskdéfini sur l'Activity - [ ]
OnNewIntentgéré avecActivityMediator.Instance.Send(intent.DataString) - [ ] URL de callback ajoutée aux Allowed Callback URLs et Allowed Logout URLs du tableau de bord Auth0
- [ ] Tokens stockés de manière sécurisée (SecureStorage ou EncryptedSharedPreferences)
- [ ] Flux de connexion/déconnexion fonctionnel
- [ ] La compilation réussit sans erreurs
Documentation détaillée
- Guide de configuration — Configuration du tenant Auth0, installation du SDK, configuration d'IntentFilter
- Motifs d'intégration — Flux de connexion/déconnexion, accès aux tokens, profil utilisateur, gestion d'erreurs
- Référence API & Tests — Référence complète
Auth0ClientOptions, claims, liste de vérification des tests, dépannage
Erreurs courantes
| Erreur | Correction |
|---|---|
| Type d'application non défini sur Native dans le tableau de bord Auth0 | Changez le type d'application en "Native" dans les paramètres du tableau de bord |
| URL de callback manquante dans le tableau de bord Auth0 | Ajoutez yourpackagename://{domain}/android/yourpackagename/callback aux Allowed Callback URLs ET Allowed Logout URLs |
DataScheme non en minuscules |
Android nécessite que le schéma soit en minuscules — utilisez le nom du package en minuscules |
LaunchMode.SingleTask manquant |
Définez LaunchMode = LaunchMode.SingleTask sur l'Activity pour éviter les instances dupliquées |
Non-gestion de OnNewIntent |
Surchargez OnNewIntent et appelez ActivityMediator.Instance.Send(intent.DataString) |
Utilisation du préfixe https:// dans Domain |
Domain doit être un nom d'hôte uniquement (par ex. tenant.auth0.com, pas https://tenant.auth0.com) |
| Non-passage du contexte Activity à Auth0Client | Passez this comme deuxième paramètre : new Auth0Client(options, this) |
| Incohérence DataHost/DataPathPrefix d'IntentFilter | Assurez-vous que DataHost correspond à votre domaine Auth0 et DataPathPrefix est /android/yourpackagename/callback |
Portée offline_access manquante |
Incluez toujours offline_access dans Scope pour recevoir les tokens de rafraîchissement pour le renouvellement silencieux |
Utilisation de LaunchMode.SingleTop au lieu de SingleTask |
Doit utiliser LaunchMode.SingleTask — SingleTop ne gère pas correctement la redirection de callback Auth0 |
| Stockage des tokens en clair dans SharedPreferences | Utilisez SecureStorage ou EncryptedSharedPreferences de la bibliothèque AndroidX Security |
Notes de test
Instruction d'agent : Rappelez à l'utilisateur de tester sur un appareil physique en plus des émulateurs. Certains comportements WebAuth (Chrome Custom Tabs, interception de schéma d'URL) peuvent différer sur les appareils physiques par rapport aux émulateurs. Testez le flux complet connexion → callback → tokens sur du matériel réel avant de livrer.
Test sur appareil physique :
- Flux de connexion : Chrome Custom Tab s'ouvre → authentification → retour à l'application
- Callback :
OnNewIntentse déclenche avec les données d'intention correctes - Flux de déconnexion : Navigateur s'ouvre → session effacée → retour à l'application
- Annulation : L'utilisateur appuie sur retour → l'application gère
UserCancelcorrectement
Skills connexes
- auth0-maui — Applications .NET MAUI multi-plateforme (iOS + Android + Windows)
- auth0-net-ios — Applications .NET iOS uniquement
- auth0-android — Applications Android natives en Kotlin
- auth0-aspnetcore-authentication — Applications web serveur ASP.NET Core
- auth0-aspnetcore-api — Web API ASP.NET Core avec validation JWT
Référence rapide
using Auth0.OidcClient;
var client = new Auth0Client(new Auth0ClientOptions
{
Domain = "YOUR_AUTH0_DOMAIN",
ClientId = "YOUR_AUTH0_CLIENT_ID",
Scope = "openid profile email offline_access"
}, this);
Connexion
var loginResult = await client.LoginAsync();
Gestion des erreurs
var loginResult = await client.LoginAsync();
if (loginResult.IsError)
{
Debug.WriteLine($"An error occurred during login: {loginResult.Error}");
}
Tokens d'accès
var loginResult = await client.LoginAsync();
if (!loginResult.IsError)
{
Debug.WriteLine($"Authentication successful.");
}
Informations utilisateur
if (!loginResult.IsError)
{
Debug.WriteLine($"name: {loginResult.User.FindFirst(c => c.Type == "name")?.Value}");
Debug.WriteLine($"email: {loginResult.User.FindFirst(c => c.Type == "email")?.Value}");
}
Lister tous les claims
if (!loginResult.IsError)
{
foreach (var claim in loginResult.User.Claims)
{
Debug.WriteLine($"{claim.Type} = {claim.Value}");
}
}
Déconnexion
BrowserResultType browserResult = await client.LogoutAsync();
Activity avec IntentFilter (Requis)
[Activity(Label = "AndroidSample", MainLauncher = true, Icon = "@drawable/icon",
LaunchMode = LaunchMode.SingleTask)]
[IntentFilter(
new[] { Intent.ActionView },
Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
DataScheme = "YOUR_ANDROID_PACKAGE_NAME",
DataHost = "YOUR_AUTH0_DOMAIN",
DataPathPrefix = "/android/YOUR_ANDROID_PACKAGE_NAME/callback")]
public class MainActivity : Activity
{
// Code omitted
}
Gestion du callback dans OnNewIntent (Requis)
protected override async void OnNewIntent(Intent intent)
{
base.OnNewIntent(intent);
Auth0.OidcClient.ActivityMediator.Instance.Send(intent.DataString);
}