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

> Documentation Index
> Fetch the relevant documentation index at: https://vonvon.id/ja/sdks/llms.txt
> Use this file to discover all available pages before exploring further.

# sdk/flutter

## 状態

パッケージのステータスは **実装済み・ローカル検証済み** です。Dart と Flutter の単体テストスイートは成功しており、PKCE、nonce と ID token の検証、guest capability、session expiry、storage contracts をカバーしています。platform-channel paths と実際の IdP ラウンドトリップの検証には、引き続き実機または simulator が必要です。このページは実装済みの動作を説明するものであり、本番対応済みであるとの主張ではありません。

Registry 状態: UNPUBLISHED。この SDK はリポジトリのソース checkout からのみインストールし、外部 package registry は使用しないでください。

## インストール

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

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

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

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

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

## クイックスタート

```dart
import 'package:vonvon/vonvon.dart';

final client = VonvonClient();

// 1. Initialize (fetches OIDC discovery). offline_access is rejected until DPoP is implemented.
await client.configure(
  const VonvonOptions(
issuer: 'https://vonvon.id',
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

| 方式 | 説明 |
| --- | --- |
| `configure(VonvonOptions, {storageAdapter?})` | SDK を初期化して OIDC ディスカバリーを取得します。他のすべてのメソッドより前に呼び出す必要があります。 |
| `signIn({}additionalParameters?, audience?})` | PKCE S256 認可 URL でシステムブラウザを開き、コードを交換して VonvonSession を返します。 |
| `handleRedirect(String url)` | App Link またはカスタムスキームコールバックを処理します。signIn によって内部的に呼び出されます。クロスプロセスリダイレクト復元には手動で呼び出します。 |
| `getSession()` | 現在の有効期限内の VonvonSession を返します。有効期限切れのローカル state を消去した場合は null を返します。 |
| `getAccessToken({}bool forceRefresh})` | 現在の有効期限内の access token を返します。forceRefresh: true の場合はセッションを消去し、再認可を要求します。 |
| `signOut({}bool openLogoutUrl})` | secure storage を消去し、必要に応じてシステムブラウザーで end\_session\_endpoint を開きます。revoke request は送信されません。 |
| `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 で検証されます。
- 新しいセッションでは access token と ID token が platform secure storage に保存されます。refreshToken compatibility field は null のままで、DPoP が実装されるまで offline\_access は拒否されます。

## 既知の制限事項

- JWKS-backed ES256 ID token verification、nonce validation、永続化された state-keyed PKCE は実装され、ローカルでテスト済みです。L4 support の前に、実デバイスと IdP での検証が引き続き必要です。
- SDK が DPoP sender binding を実装するまで offline\_access は拒否されます。access-token の有効期限が切れた場合は再認可が必要です。

Source: https://vonvon.id/ja/sdks/flutter/index.mdx
