Zustand
Paketstatus: Implementiert · lokal verifiziert. JVM-Unit-Tests (24bestanden) decken PKCE-Generierung, OAuth-State und In-Memory-Speicher ab.EncryptedSharedPreferences (Keystore AES-256-GCM), Chrome Custom Tabs undApp-Links-Verhalten erfordern ein echtes Android-Gerät oder einenEmulator. Der echte IdP-Round-Trip steht manuell aus. Diese Seitedokumentiert implementiertes Verhalten und stellt keinenProduktionsbereitschaftsnachweis dar.
Anforderungen
- Android API 26+ (Android 8.0)
- Kotlin 1.9+ und AndroidX
Installation
Fügen Sie die Abhängigkeit in build.gradle.kts Ihres App-Moduls hinzu:
dependencies {
implementation("dev.xid:xid-android:0.1.0-alpha")
}
// Local development: add to settings.gradle.kts
includeBuild("../sdk/android")Manifest-Einrichtung
Eine Callback-Activity mit einem Intent-Filter registrieren. App Links(HTTPS-Schema mit autoVerify) werden gegenüber benutzerdefiniertenSchemata empfohlen:
<!-- 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>Schnellstart
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)Kern-API
| Methode | Signatur |
|---|---|
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) |
Fehlertypen
Alle SDK-Fehler sind Unterklassen der versiegelten Klasse XidException:
| Unterklasse | Auslöser |
|---|---|
NotConfigured |
configure() wurde nicht aufgerufen |
UserCancelled |
Benutzer hat Custom Tabs geschlossen, ohne abzuschließen |
StateMismatch |
OAuth-State-Abweichung — möglicher CSRF |
TokenExchangeFailed |
Token-Endpunkt hat einen Fehler zurückgegeben |
TokenRefreshFailed |
Refresh-Token abgelaufen oder widerrufen |
NoSession |
Sitzungsmethode aufgerufen, während abgemeldet |
Sicherheit
- Öffentlicher Client — kein Client-Secret gespeichert oder übertragen.
- Nur PKCE S256. Der Server lehnt die Plain-Challenge-Methode ab.
- EncryptedSharedPreferences auf Basis von Android Keystore (AES-256-GCM)schützen den Token-Speicher im Ruhezustand.
- Zufälliger OAuth-State wird pro Anfrage generiert; bei der Weiterleitungzur CSRF-Prävention validiert.
Bekannte Einschränkungen
- Die JWKS-gestützte ID-Token-Prüfung ist implementiert und lokal unit-getestet. Für L4 sind noch Android-Geräte- oder Emulator- und echte IdP-Tests erforderlich.
- Kein Mechanismus, um zu erkennen, wann der Benutzer Custom Tabs schließt,ohne die Autorisierung abzuschließen.
- Nur ein Konto — die Speicherschicht verwendet feste Schlüssel.