Aller au contenu

sdk/flutter

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.

Afficher en Markdown

Statut

L’état du package est Implémenté et vérifié localement. La suite de tests unitaires Dart et Flutter réussit et couvre PKCE, la vérification du nonce et du jeton d’identité, la capacité invité, l’expiration de session et les contrats de stockage. Les chemins platform-channel et un aller-retour réel avec un IdP nécessitent encore un appareil ou un simulateur. Cette page documente le comportement implémenté; elle ne constitue pas une déclaration d’aptitude à la production.

Statut du registre : UNPUBLISHED. Installez ce SDK uniquement depuis un checkout du code source du dépôt ; n’utilisez pas de registre de paquets externe.

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

Configuration 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). offline_access is rejected until DPoP is implemented.
await client.configure(
  const XidOptions(
    issuer: 'https://xid.dev',
    clientId: 'YOUR_CLIENT_ID',
    redirectUri: 'com.example.myapp://auth/callback',
    scopes: ['openid', 'profile', 'email'],
  ),
);

// 2. Sign in (opens system browser, PKCE S256)
final session = await client.signIn();
print(session.user.email);

// 3. Get the current unexpired access token. Expiry requires reauthorization.
final token = await client.getAccessToken();

// 4. Get the current unexpired session.
final current = await client.getSession();

// 5. Clear secure storage and optionally open end_session. No revoke request is sent.
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 la XidSession actuelle non expirée, ou null après avoir effacé l’état local expiré.
getAccessToken({}bool forceRefresh}) Retourner le jeton d’accès actuel non expiré. forceRefresh: true efface la session et exige une nouvelle autorisation.
signOut({}bool openLogoutUrl}) Effacer le stockage sécurisé et ouvrir éventuellement end_session_endpoint dans le navigateur système; aucune requête de révocation n’est envoyée.
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 nouvelles sessions stockent les jetons d’accès et d’identité dans le stockage sécurisé de la plateforme. Le champ de compatibilité refreshToken reste null, et offline_access est rejeté tant que DPoP n’est pas implémenté.

Limites connues

  • La vérification des jetons d’identité ES256 adossée à JWKS, la validation du nonce et le PKCE persisté indexé par état sont implémentés et testés localement. La validation sur un appareil réel et auprès d’un IdP reste requise avant le support L4.
  • offline_access est rejeté tant que le SDK n’implémente pas la liaison d’expéditeur DPoP; l’expiration du jeton d’accès exige une nouvelle autorisation.
Navigation

Saisissez votre recherche...

Utilisez les touches fléchées pour naviguerAppuyez sur Entrée pour sélectionnerAppuyez sur Échap pour fermer