Aller au contenu

sdk/android

SDK Kotlin pour Android utilisant Chrome Custom Tabs, le flux de coded'autorisation PKCE S256 et le stockage des jetons viaEncryptedSharedPreferences reposant sur Keystore.

Afficher en Markdown

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.
Navigation

Saisissez votre recherche...

Utilisez les touches fléchées pour naviguerAppuyez sur Entrée pour sélectionnerAppuyez sur Échap pour fermer