---
title: "sdk/flutter"
description: "SDK Dart / Flutter pour iOS, Android et bureau utilisantflutter_web_auth_2, le flux de code d'autorisation PKCE S256 et lapersistance des jetons via flutter_secure_storage."
locale: "fr"
---

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

# sdk/flutter

## Statut

Le statut du package est **Implémenté · vérifié localement**. Les testsunitaires Dart pur (21 réussis) couvrent PKCE, les modèles de jetons et lestockage en mémoire. Les chemins via canaux de plateforme(flutter\_secure\_storage, flutter\_web\_auth\_2) nécessitent un vrai appareilou simulateur pour être vérifiés. 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.

## Installation

Ajoutez dans pubspec.yaml et exécutez flutter pub get :

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

## Configuration de la plateforme

Enregistrez le schéma URI de callback sur chaque plateforme.

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

## Démarrage rapide

```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();
```

## API principale

| Méthode | Description |
| --- | --- |
| `configure(XidOptions, {storageAdapter?})` | Initialiser le SDK et récupérer la découverte OIDC. Doit être appelé avanttoutes les autres méthodes. |
| `signIn({}additionalParameters?, audience?})` | Ouvrir le navigateur système avec l'URL d'autorisation PKCE S256 ;échanger le code et retourner XidSession. |
| `handleRedirect(String url)` | Traiter un callback App Link ou de schéma personnalisé. Appelé en internepar signIn ; invoquer manuellement pour la récupération de redirectioninter-processus. |
| `getSession()` | Retourner XidSession? — déclenche la rotation du jeton d'actualisation sile jeton d'accès est proche de l'expiration (dans les 60 s). |
| `getAccessToken({}bool forceRefresh})` | Retourner une chaîne de jeton d'accès valide. Passez forceRefresh: truepour forcer le renouvellement. |
| `signOut({}bool openLogoutUrl})` | Révoquer le jeton d'actualisation (RFC 7009), vider le stockage sécuriséet ouvrir optionnellement end\_session\_endpoint dans le navigateur. |
| `setTokenStorage(TokenStorageAdapter)` | Remplacer le SecureStorageAdapter par défaut (flutter\_secure\_storage) parune implémentation personnalisée. |

## Dépendances

| Package | Version | Objectif |
| --- | --- | --- |
| `flutter_web_auth_2` | ^4.0.0 | Session d'autorisation via le navigateur système et réception du callback |
| `flutter_secure_storage` | ^9.2.4 | Stockage sécurisé de la plateforme (Keychain / Keystore / DPAPI) |
| `crypto` | ^3.0.3 | SHA-256 pour le calcul du challenge PKCE S256 |
| `http` | ^1.2.2 | Client HTTP pour les points de terminaison de découverte et de jeton |

## Sécurité

- Client public — aucun secret client stocké ni transmis.
- PKCE S256 uniquement. Pas de flux implicite ni de grant par mot de passe.
- État OAuth généré par requête ; validé dans handleRedirect pour prévenirle CSRF.
- Les jetons d'actualisation sont stockés dans le stockage sécurisé de laplateforme (Keychain sur iOS, Keystore sur Android) et tournés à chaqueutilisation par le serveur XID.

## Limites connues

- La verification ES256 du jeton ID par JWKS, PKCE persistant par state et refresh single-flight sont implementes et testes localement. Des validations sur appareil reel et IdP restent requises avant le support L4.
- offline\_access doit être inclus dans les portées pour recevoir un jetond'actualisation.

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