> ## 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.

# Recuperación segura de sesión

> El SDK ofrece la opción de almacenar la información de la wallet de sesión de forma segura en ciertas plataformas utilizando el almacenamiento seguro nativo.

# Recuperación de sesiones

Por defecto, el SDK requerirá que los usuarios inicien sesión cada vez que la aplicación se cierre completamente. Esto se debe a que, por defecto, no guardamos la información de la wallet de sesión (por ejemplo, claves privadas) en ningún tipo de almacenamiento persistente para proteger la seguridad del usuario.

Sin embargo, en ciertas plataformas, hemos integrado el almacenamiento seguro nativo de la plataforma.

Si habilita `StoreSessionPrivateKeyInSecureStorage` en su ScriptableObject `SequenceConfig`, almacenaremos automáticamente la información de la wallet de sesión (en plataformas compatibles) y expondremos la opción de intentar recuperar la sesión en `SequenceLogin`. La `SequenceLoginWindow` predeterminada gestionará automáticamente este flujo de UI también (consulte [Autenticación](/sdk/unity/onboard/authentication/intro)). Si la plataforma no es compatible, esta opción no tendrá efecto.

A continuación puede ver las plataformas compatibles y aprender sobre la solución de almacenamiento seguro de cada una; es importante entender los conceptos básicos de cómo funcionan estos sistemas y pensar cuidadosamente en las implicaciones de seguridad de almacenar claves privadas (o cualquier secreto) en almacenamiento persistente.

## Integración

Tiene dos opciones para recuperar una wallet desde el almacenamiento. La primera es usar la clase `EmbeddedWalletAdapter`. Si esta llamada tiene éxito, el `EmbeddedWalletAdapter` contendrá la instancia de Wallet.

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

De lo contrario, utilice la clase subyacente `SequenceLogin`.

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

En ambos casos, puede escuchar el evento `SequenceWallet.OnWalletCreated` cada vez que una wallet se recupere del almacenamiento o se cree durante el proceso de inicio de sesión.

## Detalles de la plataforma

### Editor

En el editor, usamos PlayerPrefs para almacenar la clave privada. También deberá habilitar `EditorStoreSessionPrivateKeyInSecureStorage` en SequenceConfig para usar el almacenamiento seguro y recuperar sesiones dentro del editor. Esta bandera separada le facilita probar ambos flujos sin modificar el comportamiento de sus builds. El almacenamiento seguro en el editor es solo para fines de desarrollo y no debe considerarse seguro para almacenamiento a largo plazo.

### iOS

En iOS, utilizamos el [iOS Keychain](https://developer.apple.com/documentation/security/keychain_services?language=objc).

### MacOS

En MacOS, utilizamos el [MacOS Keychain](https://developer.apple.com/documentation/security/keychain_services?language=objc).

### Windows

En PCs con Windows, utilizamos la [Crypto: Next Generation - Data Protection API (CNG DPAPI)](https://learn.microsoft.com/en-us/windows/win32/seccng/cng-dpapi)

### Web

En compilaciones Web, utilizamos [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API) a través de [PlayerPrefs](https://docs.unity3d.com/ScriptReference/PlayerPrefs.html).

### Android

En compilaciones Android, utilizamos el [Android Keystore](https://developer.android.com/privacy-and-security/keystore).

El primer paso es importar el plugin `AndroidKeyBridge.java` en su carpeta Assets. Esto se hace fácilmente desde Samples en el package manager; simplemente importe el sample titulado `Android Secure Storage`.

Nuestro plugin Keystore para Unity (incluido en el SDK) requiere una Plantilla Gradle Principal personalizada. Por favor, vaya a la configuración de su proyecto y, en `Player > Publishing Settings`, habilite `Custom Main Gradle Template`. Esto creará un archivo `Assets/Plugins/Android/mainTemplate.gradle` (o similar; el editor le mostrará la ruta) si aún no tiene uno. Aquí tiene un ejemplo de archivo `mainTemplate.gradle`; por favor, copie/pegue (o incorpore en su archivo existente).

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

Nuestro plugin Keystore también requiere una Plantilla de Propiedades Gradle personalizada. Nuevamente, vaya a la configuración de su proyecto y, en `Player > Publishing Settings`, habilite `Custom Gradle Properties Template`. Esto creará un archivo `Assets/Plugins/Android/gradleTemplate.properties` (o similar; el editor le mostrará la ruta) si aún no tiene uno. Aquí tiene un ejemplo de archivo `gradleTemplate.properties`; por favor, copie/pegue (o incorpore en su archivo existente).

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

## Solución de problemas

Si tiene problemas con el almacenamiento seguro o Google Sign-In en Android, siga estos pasos de solución de problemas.

* **Google Sign-In:** Asegúrese de que el valor `data android:scheme` en su archivo `AndroidManifest.xml` coincida con el `Url Scheme` en su archivo
  `SequenceConfig.asset`. Verifique que esté todo en minúsculas.
* **Almacenamiento seguro:** Asegúrese de que su `mainTemplate.gradle` defina correctamente el plugin `androidx.security:security-crypto` y que no sea
  sobrescrito por otro plugin o por el Android Plugin Resolver.
* **Pruebe nuestra demo:** [Instale nuestra build de demostración](https://drive.google.com/file/d/1rAvnPu56Hj3yDRL32_lr887xt-xMQoYK/view?usp=sharing)
  y asegúrese de que funcione correctamente en su dispositivo.
  * Compare la configuración de su proyecto Unity (AndroidManifest, archivos gradle, configuración del reproductor de Android) con nuestro [proyecto sdk.](https://github.com/0xsequence/sequence-unity)
* **Ideas adicionales:** Desinstale la app antes de instalar una nueva build, cambie su esquema de URL o el bundle id.
