# Сохранение токенов в Keychain

В процессе интеграции требуется сделать связку игры и приложения кошелька, это делается через обмен токенами и перенаправление в приложение кошелька, для подтверждения связки аккаунтов. Однако, данный способ не будет работать в случае, когда у пользователя еще нет установленного приложения LinQ Wallet.

Для таких случаев следует использовать сохранение токена доступа в специальное хранилище [Keychain](https://developer.apple.com/documentation/security/keychain_services). Тогда, после перенаправления игрока в Apple Store и установки приложения кошелька, приложение кошелька сможет получить данный токен из хранилища и осуществить запрос на авторизацию игры.

После проверки токена и подтверждения своего намерения связать аккаунты, пользователь будет перенаправлен обратно в игру, где необходимо будет выполнить [запрос для входа пользователя](https://galactica-games.gitbook.io/integration-sdk/sections/registraciya-i-avtorizaciya#avtorizaciya-i-poluchenie-tokena-dostupa) с ранее полученным токеном.

## Ограничения при работе с Keychain

Основных ограничения два: данный механизм работает только в экосистеме Apple и данный механизм работает только в случае, когда у приложений один общий аккаунт в Apple Store. Таким образом, данную интеграцию можно будет реализовать только после переноса игры на аккаунт Galactica Games.&#x20;

Для Android-версии подобного решения пока нет, но возможно будет в ближайшее время.

## Пример реализации

Для работы с Keychain в Unity можно использовать плагин [iOS Keychain Plugin](https://assetstore.unity.com/packages/3d/characters/ios-keychain-plugin-43083), но не обязательно, возможно есть лучшие решения.

В игре Solitaire Coin в момент нажатия на кнопку "Sign In with LinQ" перед перенаправлением пользователя в LinQ (если установлен) или в AppStore (если не установлен), полученный от API `user_token` сохраняется в хранилище.

```csharp
API.GetLinqUserToken(response =>
{
  #if UNITY_IOS
    Keychain.SetValue("walletUserToken", response.token);
  #endif
}, error =>
{
  // handle error
}
```

Далее следует реализовать обработку ситуации, когда пользователь вернулся в игру и сделать запрос на подтверждение связки аккаунтов.

## Проверка токена LinQ Wallet

Данный тип интеграции ***не обязателен***, но такая возможность существует. Приложение кошелька имеет возможность проверить, какие из зарегистрированных игр установленны на телефоне пользователя и при входе в приложение кошелька, предлагает авторизовать эту игру, аналогично ситуации, когда пользователь был перенаправлен из игры в кошелек.&#x20;

В таком случае приложение кошелька со своей стороны генерирует `user_token` и при подтверждении его пользователем, авторизует данный запрос, а токен кладет в хранилище Keychain. На стороне игры следует обратиться к хранилищу Keychain и если там есть токен, то выполнить запрос на подтверждения связки аккаунтов.

```csharp
#if UNITY_IOS

  var token = Keychain.GetValue(TOKEN_MAP_KEY);

  API.AuthSignIn(token, OnSingInSuccess, OnSingInError);

#endif
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://galactica-games.gitbook.io/integration-sdk/sections/registraciya-i-avtorizaciya/sokhranenie-tokenov-v-keychain.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
