コンテンツへ移動

sdk/flutter

flutter_web_auth_2、PKCE S256 認可コードフロー、flutter_secure_storage トークン永続化を使用した iOS、Android、デスクトップ向け Dart / Flutter SDK。

Markdown で表示

状態

パッケージステータス:実装済み・ローカル検証済み。純粋 Dart 単体テスト(21 ケースパス)は PKCE、トークンモデル、メモリ内ストレージをカバーします。プラットフォームチャネルのパス(flutter_secure_storage、flutter_web_auth_2)は実際のデバイスまたはシミュレーターでの検証が必要です。実際の IdP ラウンドトリップは手動検証待ちです。このページは実装済みの動作を記録したものであり、本番対応の主張ではありません。

インストール

pubspec.yaml に追加して flutter pub get を実行します:

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

プラットフォームセットアップ

各プラットフォームでコールバック URI スキームを登録します。

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

クイックスタート

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

方式 説明
configure(XidOptions, {storageAdapter?}) SDK を初期化して OIDC ディスカバリーを取得します。他のすべてのメソッドより前に呼び出す必要があります。
signIn({}additionalParameters?, audience?}) PKCE S256 認可 URL でシステムブラウザを開き、コードを交換して XidSession を返します。
handleRedirect(String url) App Link またはカスタムスキームコールバックを処理します。signIn によって内部的に呼び出されます。クロスプロセスリダイレクト復元には手動で呼び出します。
getSession() XidSession? を返します — アクセストークンが期限切れ間近(60 秒以内)の場合、リフレッシュトークンのローテーションをトリガーします。
getAccessToken({}bool forceRefresh}) 有効なアクセストークン文字列を返します。forceRefresh: true を渡すと強制更新します。
signOut({}bool openLogoutUrl}) リフレッシュトークンを取り消し(RFC 7009)、セキュアストレージをクリアし、オプションでブラウザに end_session_endpoint を開きます。
setTokenStorage(TokenStorageAdapter) デフォルト SecureStorageAdapter(flutter_secure_storage)をカスタム実装で置き換えます。

依存関係

パッケージ バージョン 目的
flutter_web_auth_2 ^4.0.0 システムブラウザの認可セッションとコールバック受信
flutter_secure_storage ^9.2.4 プラットフォームセキュアストレージ(Keychain / Keystore / DPAPI)
crypto ^3.0.3 PKCE S256 チャレンジ計算用 SHA-256
http ^1.2.2 ディスカバリーおよびトークンエンドポイント用 HTTP クライアント

セキュリティ

  • パブリッククライアント — クライアントシークレットは保存・送信されません。
  • PKCE S256 のみ。implicit フローとパスワードグラントは使用しません。
  • リクエストごとに生成される OAuth state。CSRF を防ぐため handleRedirect で検証されます。
  • リフレッシュトークンはプラットフォームセキュアストレージ(iOS では Keychain、Android では Keystore)に保存され、XID サーバーによって使用のたびにローテーションされます。

既知の制限事項

  • JWKS による ES256 ID token 検証、state 単位で永続化する PKCE、refresh single-flight は実装済みでローカルテスト済みです。L4 には実機と IdP の検証が必要です。
  • リフレッシュトークンを受け取るには offline_access をスコープに含める必要があります。
ナビゲーション

入力して検索...

矢印キーで移動Enter キーで選択Escape キーで閉じる