> ## Documentation Index
> Fetch the complete documentation index at: https://sequence-0fb8d9e6-6461-checkout-updates.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# セキュアなセッション復元

> SDK では、一部のプラットフォームでネイティブのセキュアストレージを利用してセッションウォレット情報を安全に保存するオプションを提供しています。

# セッションの復元

デフォルトでは、アプリを完全に終了するたびにユーザーは再度サインインが必要です。これは、ユーザーの安全のため、セッションウォレット情報（例：秘密鍵）を永続的なストレージに保存しないためです。

ただし、一部のプラットフォームでは、プラットフォーム独自のセキュアストレージと連携しています。

`SequenceConfig` ScriptableObjectで`StoreSessionPrivateKeyInSecureStorage`を有効にすると、（対応プラットフォームでは）セッションウォレット情報が自動的に安全なストレージに保存され、`SequenceLogin`でセッションの復元を試みることができます。デフォルトの`SequenceLoginWindow`は、このUIフローも自動的に処理します（詳細は[Authentication](/sdk/unity/onboard/authentication/intro)をご覧ください）。プラットフォームが非対応の場合、このフラグは効果を持ちません。

対応プラットフォームや各プラットフォームのセキュアストレージについては下記をご覧ください。これらのシステムの基本的な仕組みや、秘密鍵（またはその他の機密情報）を永続ストレージに保存する際のセキュリティリスクについて十分に理解しておくことが重要です。

## インテグレーション

ウォレットをストレージから復元する方法は2つあります。1つ目は、`EmbeddedWalletAdapter` クラスを使用する方法です。この呼び出しが成功すると、`EmbeddedWalletAdapter` にウォレットインスタンスが格納されます。

```csharp theme={null}
bool recovered = await EmbeddedWalletAdapter.GetInstance().TryRecoverWalletFromStorage();
```

それ以外の場合は、基盤となる `SequenceLogin` クラスを使用してください。

```csharp theme={null}
(bool storageEnabled, IWallet wallet) = await SequenceLogin.GetInstance().TryToRestoreSessionAsync();
```

どちらの場合でも、ウォレットがストレージから復元されたり、サインイン時に作成された際には、`SequenceWallet.OnWalletCreated` イベントを監視できます。

## プラットフォームの詳細

### エディター

エディターでは、秘密鍵の保存に PlayerPrefs を使用しています。また、セキュアストレージを利用してセッションを復元するには、SequenceConfig で `EditorStoreSessionPrivateKeyInSecureStorage` を有効にする必要があります。このフラグを個別に設定することで、ビルドの挙動を変更せずに両方のフローをテストしやすくなります。エディターでのセキュアストレージは開発用途のみを想定しており、長期的な保存には適していません。

### iOS

iOS では、[iOS Keychain](https://developer.apple.com/documentation/security/keychain_services?language=objc) を利用しています。

### MacOS

MacOS では、[MacOS Keychain](https://developer.apple.com/documentation/security/keychain_services?language=objc) を利用しています。

### Windows

Windows PC では、[Crypto: Next Generation - Data Protection API (CNG DPAPI)](https://learn.microsoft.com/en-us/windows/win32/seccng/cng-dpapi) を利用しています。

### Web

Web ビルドでは、[PlayerPrefs](https://docs.unity3d.com/ScriptReference/PlayerPrefs.html) を通じて [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) を利用しています。

### Android

Android ビルドでは、[Android Keystore](https://developer.android.com/privacy-and-security/keystore) を利用しています。

まず最初に、`AndroidKeyBridge.java` プラグインを Assets フォルダにインポートします。これはパッケージマネージャーのサンプルから行うのが最も簡単です。`Android Secure Storage` というサンプルをインポートしてください。

Unity 用の Keystore プラグイン（SDK に含まれています）には、カスタム Main Gradle テンプレートが必要です。Project Settings で `Player > Publishing Settings` に進み、`Custom Main Gradle Template` を有効にしてください。これにより、`Assets/Plugins/Android/mainTemplate.gradle`（または類似のパス、エディターで確認可能）が作成されます。まだファイルがない場合は、以下のサンプル `mainTemplate.gradle` ファイルをコピー＆ペーストしてください（既存ファイルに組み込んでも構いません）。

```
apply plugin: 'com.android.library'
**APPLY_PLUGINS**

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.security:security-crypto:1.1.0-alpha03'

**DEPS**}

android {
    compileSdkVersion **APIVERSION**
    buildToolsVersion '**BUILDTOOLS**'

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }

    defaultConfig {
        minSdkVersion **MINSDKVERSION**
        targetSdkVersion **TARGETSDKVERSION**
        ndk {
            abiFilters **ABIFILTERS**
        }
        versionCode **VERSIONCODE**
        versionName '**VERSIONNAME**'
        consumerProguardFiles 'proguard-unity.txt'**USER_PROGUARD**
    }

    lintOptions {
        abortOnError false
    }

    aaptOptions {
        noCompress = **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ')
        ignoreAssetsPattern = "!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~"
    }**PACKAGING_OPTIONS**
}**REPOSITORIES**
**IL_CPP_BUILD_SETUP**
**SOURCE_BUILD_SETUP**
**EXTERNAL_SOURCES**
```

Keystore プラグインには、カスタム Gradle Properties テンプレートも必要です。同様に Project Settings の `Player > Publishing Settings` で `Custom Gradle Properties Template` を有効にしてください。これにより、`Assets/Plugins/Android/gradleTemplate.properties`（または類似のパス、エディターで確認可能）が作成されます。まだファイルがない場合は、以下のサンプル `gradleTemplate.properties` ファイルをコピー＆ペーストしてください（既存ファイルに組み込んでも構いません）。

```
org.gradle.jvmargs=-Xmx**JVM_HEAP_SIZE**M
org.gradle.parallel=true
android.enableJetifier=true
android.useAndroidX=true
unityStreamingAssets=**STREAMING_ASSETS**
**ADDITIONAL_PROPERTIES**

android.enableR8=**MINIFY_WITH_R_EIGHT**
```

## トラブルシューティング

Android でセキュアストレージや Google サインインに問題が発生した場合は、以下のトラブルシューティング手順をお試しください。

* **Google サインイン:** `AndroidManifest.xml` ファイル内の `data android:scheme` の値が、`SequenceConfig.asset` ファイルの `Url Scheme` と一致しているか確認してください。すべて小文字で記載されていることもご確認ください。
* **セキュアストレージ:** `mainTemplate.gradle` で `androidx.security:security-crypto` プラグインが正しく定義されており、他のプラグインや Android Plugin Resolver によって上書きされていないことを確認してください。
* **デモをお試しください:** [デモビルドをインストール](https://drive.google.com/file/d/1rAvnPu56Hj3yDRL32_lr887xt-xMQoYK/view?usp=sharing) し、お使いのデバイスで正常に動作するかご確認ください。
  * Unity プロジェクトの設定（AndroidManifest、gradle ファイル、Android プレイヤー設定）を、弊社の [SDK プロジェクト](https://github.com/0xsequence/sequence-unity) と比較してください。
* **追加のアイデア:** 新しいビルドをインストールする前にアプリをアンインストールする、URL スキームやバンドル ID を変更する、などもお試しください。
