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 :
# pubspec.yaml
dependencies:
xid:
git:
url: https://github.com/StringKe/xid
path: sdk/flutter
ref: mainConfiguration de la plateforme
Enregistrez le schéma URI de callback sur chaque plateforme.
<!-- 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
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.