Zustand
Paketstatus: Implementiert · lokal verifiziert.Pure-Dart-Unit-Tests (21 bestanden) decken PKCE, Token-Modelle undIn-Memory-Speicher ab. Plattformkanal-Pfade (flutter_secure_storage,flutter_web_auth_2) erfordern ein echtes Gerät oder einen Simulator zurVerifizierung. Der echte IdP-Round-Trip steht manuell aus. Diese Seitedokumentiert implementiertes Verhalten und stellt keinenProduktionsbereitschaftsnachweis dar.
Installation
Zu pubspec.yaml hinzufügen und flutter pub get ausführen:
# pubspec.yaml
dependencies:
xid:
git:
url: https://github.com/StringKe/xid
path: sdk/flutter
ref: mainPlattform-Einrichtung
Das Callback-URI-Schema auf jeder Plattform registrieren.
<!-- Android: AndroidManifest.xml (main Activity) -->
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="com.example.myapp" android:host="auth" />
</intent-filter>
<!-- iOS: Info.plist -->
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLSchemes</key>
<array><string>com.example.myapp</string></array>
</dict>
</array>Schnellstart
import 'package:xid/xid.dart';
final client = XidClient();
// 1. Initialize (fetches OIDC discovery)
await client.configure(
const XidOptions(
issuer: 'https://xid.dev',
clientId: 'YOUR_CLIENT_ID',
redirectUri: 'com.example.myapp://auth/callback',
scopes: ['openid', 'profile', 'email', 'offline_access'],
),
);
// 2. Sign in (opens system browser, PKCE S256)
final session = await client.signIn();
print(session.user.email);
// 3. Get valid access token (auto-refreshes)
final token = await client.getAccessToken();
// 4. Get current session
final current = await client.getSession();
// 5. Sign out (revokes refresh token + clears secure storage)
await client.signOut();Kern-API
| Methode | Beschreibung |
|---|---|
configure(XidOptions, {storageAdapter?}) |
SDK initialisieren und OIDC-Discovery abrufen. Muss vor allen anderenMethoden aufgerufen werden. |
signIn({}additionalParameters?, audience?}) |
Systembrowser mit PKCE-S256-Autorisierungs-URL öffnen; Code eintauschenund XidSession zurückgeben. |
handleRedirect(String url) |
App-Link- oder Custom-Scheme-Callback verarbeiten. Wird intern von signInaufgerufen; manuell aufrufen für prozessübergreifendeRedirect-Wiederherstellung. |
getSession() |
XidSession? zurückgeben — löst Refresh-Token-Rotation aus, wenn derAccess-Token nahe am Ablauf ist (innerhalb 60 s). |
getAccessToken({}bool forceRefresh}) |
Einen gültigen Access-Token-String zurückgeben. forceRefresh: trueübergeben, um eine Erneuerung zu erzwingen. |
signOut({}bool openLogoutUrl}) |
Refresh-Token widerrufen (RFC 7009), sicheren Speicher leeren und optionalend_session_endpoint im Browser öffnen. |
setTokenStorage(TokenStorageAdapter) |
Den Standard-SecureStorageAdapter (flutter_secure_storage) durch einebenutzerdefinierte Implementierung ersetzen. |
Abhängigkeiten
| Paket | Version | Zweck |
|---|---|---|
flutter_web_auth_2 |
^4.0.0 | Systembrowser-Autorisierungssitzung und Callback-Empfang |
flutter_secure_storage |
^9.2.4 | Plattformsicherer Speicher (Keychain / Keystore / DPAPI) |
crypto |
^3.0.3 | SHA-256 für die PKCE-S256-Challenge-Berechnung |
http |
^1.2.2 | HTTP-Client für Discovery- und Token-Endpunkte |
Sicherheit
- Öffentlicher Client — kein Client-Secret gespeichert oder übertragen.
- Nur PKCE S256. Kein Implicit Flow oder Password Grant.
- OAuth-State wird pro Anfrage generiert; in handleRedirect zurCSRF-Prävention validiert.
- Refresh-Tokens werden im plattformsicheren Speicher gespeichert (Keychainunter iOS, Keystore unter Android) und bei jeder Verwendung vom XID-Serverrotiert.
Bekannte Einschränkungen
- Die JWKS-gestützte ES256-ID-Token-Prüfung, zustandsbasierte persistente PKCE und Refresh-Single-Flight sind implementiert und lokal getestet. Für L4 sind noch echte Geräte- und IdP-Tests erforderlich.
- offline_access muss in den Scopes enthalten sein, um ein Refresh-Token zuerhalten.