Statut
Le statut du package est Implémenté · vérifié localement. Les testsunitaires JVM (24 réussis) couvrent la génération PKCE, l’état OAuth et lestockage en mémoire. EncryptedSharedPreferences (Keystore AES-256-GCM),Chrome Custom Tabs et le comportement des App Links nécessitent un vraiappareil Android ou un émulateur. L’aller-retour réel avec un IdP est enattente de vérification manuelle. Cette page documente le comportementimplémenté ; ce n’est pas une affirmation de disponibilité en production.
Prérequis
- Android API 26+ (Android 8.0)
- Kotlin 1.9+ et AndroidX
Installation
Ajoutez la dépendance au fichier build.gradle.kts de votre moduled’application :
dependencies {
implementation("dev.xid:xid-android:0.1.0-alpha")
}
// Local development: add to settings.gradle.kts
includeBuild("../sdk/android")Configuration du manifeste
Enregistrez une Activity de callback avec un intent-filter. Les App Links(schéma HTTPS avec autoVerify) sont recommandés par rapport aux schémaspersonnalisés :
<!-- AndroidManifest.xml -->
<activity android:name=".AuthCallbackActivity" android:exported="true">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="https"
android:host="yourapp.example.com"
android:pathPrefix="/auth/callback" />
</intent-filter>
</activity>Démarrage rapide
import dev.xid.sdk.Xid
import dev.xid.sdk.model.XidConfig
// 1. Initialize in Application.onCreate
Xid.configure(
context = this,
config = XidConfig(
issuer = "https://xid.dev",
clientId = "your_client_id",
redirectUri = "https://yourapp.example.com/auth/callback",
scopes = listOf("openid", "profile", "email", "offline_access"),
)
)
// 2. Sign in (opens Chrome Custom Tabs)
lifecycleScope.launch { Xid.signIn(requireContext()) }
// 3. Handle redirect in AuthCallbackActivity
val session = Xid.handleRedirect(intent.data.toString())
// 4. Get current session (auto-refreshes near expiry)
val session = Xid.getSession()
// 5. Get access token
val token = Xid.getAccessToken()
// 6. Sign out
Xid.signOut(context = this, openEndSession = true)API principale
| Méthode | Signature |
|---|---|
configure |
fun configure(context: Context, config: XidConfig) |
signIn |
suspend fun signIn(context: Context, options: SignInOptions? = null) |
handleRedirect |
suspend fun handleRedirect(url: String): XidSession |
getSession |
suspend fun getSession(): XidSession? |
getAccessToken |
suspend fun getAccessToken(options: GetAccessTokenOptions? = null): String |
signOut |
suspend fun signOut(context: Context? = null, openEndSession: Boolean = false) |
setTokenStorage |
fun setTokenStorage(adapter: TokenStorageAdapter) |
Types d’erreur
Toutes les erreurs SDK sont des sous-types de la classe scelléeXidException :
| Sous-classe | Déclencheur |
|---|---|
NotConfigured |
configure() n’a pas été appelé |
UserCancelled |
L’utilisateur a fermé les Custom Tabs sans terminer |
StateMismatch |
Incohérence d’état OAuth — possible CSRF |
TokenExchangeFailed |
Le point de terminaison de jeton a renvoyé une erreur |
TokenRefreshFailed |
Jeton d’actualisation expiré ou révoqué |
NoSession |
Méthode de session appelée hors connexion |
Sécurité
- Client public — aucun secret client stocké ni transmis.
- PKCE S256 uniquement. Le serveur rejette la méthode plain challenge.
- EncryptedSharedPreferences reposant sur Android Keystore (AES-256-GCM)protège le stockage des jetons au repos.
- État OAuth aléatoire généré par requête ; validé lors de la redirectionpour prévenir le CSRF.
Limites connues
- La verification du jeton ID par JWKS est implementee et testee localement. Les validations appareil ou emulateur Android et IdP reel restent requises avant L4.
- Aucun mécanisme pour détecter quand l’utilisateur ferme Custom Tabs sansterminer l’autorisation.
- Compte unique uniquement — la couche de stockage utilise des clés fixes.