---
title: "sdk/flutter"
description: "Dart/Flutter-SDK für iOS, Android und Desktop mit flutter_web_auth_2,PKCE-S256-Autorisierungscode-Flow und flutter_secure_storage zurToken-Persistenz."
locale: "de"
---

> Documentation Index
> Fetch the locale documentation index at: https://xid.dev/de/llms.txt
> Use this file to discover all available pages before exploring further.

# sdk/flutter

## 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:

```yaml
# pubspec.yaml
dependencies:
  xid:
git:
  url: https://github.com/StringKe/xid
  path: sdk/flutter
  ref: main
```

## Plattform-Einrichtung

Das Callback-URI-Schema auf jeder Plattform registrieren.

```xml
<!-- 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

```dart
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.

Source: https://xid.dev/de/sdks/flutter/index.mdx
