# Аутентификация

## Общая информация

Для обновления информации в профиле Пользователя ЭСП МОНЕТА.РУ сервисом MonetaId маркетплейс должен сформировать специальный одноразовый токен.

## Формирование токена и подписи

Предварительные условия:

1. Необходимо пройти процедуру [регистрации маркетплейса](https://docs.payanyway.ru/marketplace/zaprosy-dlya-registracii-fl/identifikaciya-s-pomoshyu-monetaid/registraciya-marketpleisa) и получить `ApiKey` и `ApiSecret`.
2. Необходимо [установить доверительные отношения](https://docs.payanyway.ru/marketplace/zaprosy-dlya-registracii-fl/identifikaciya-s-pomoshyu-monetaid/ustanovlenie-doveriya) с сервисом MonetaId.

Для реализации алгоритма формирования единовременного токена использованы следующие стандарты:

1. RFC 3986 Uniform Resource Identifier (URI): Generic Syntax.
2. RFC 2104 HMAC: Keyed-Hashing for Message Authentication.
3. RFC 4648 The Base16, Base32, and Base64 Data Encodings.

Токен состоит из 2-х частей:

1. Информационное сообщение, содержащее ключевую информацию о маркетплейсе и Пользователе ЭСП МОНЕТА.РУ, служебную информацию.
2. Подпись/Хеш от информационного сообщения из п.1., и использование заранее полученного общего секрета - `ApiSecret`.

### Формирование информационного сообщения

Информационное сообщение состоит из набора ключ-значение, которые закодированы в соответствии с правилами URL-кодирования строк по RFC 3986. Пример:

```javascript
key1=someKey&key2=Some%20Key2&extraKey=100500
```

Ниже приведен набор обязательных параметров, которые необходимо указать при формировании информационного сообщения (**ключи должны следовать в отсортированном порядке, как в таблице ниже**):

| Ключ                    | Описание                                                                                                                                                                                                                                                                                                                                                                                                                                                                    | Тип                | Пример               |
| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ | -------------------- |
| **callbackUrlOverride** | <p><strong>Опциональный параметр</strong> <br>для дев окружения: </p><p>Возможность задать <a href="https://docs.payanyway.ru/marketplace/zaprosy-dlya-registracii-fl/identifikaciya-s-pomoshyu-monetaid/webhook-o-statuse-identifikacii">тестовый callback урл,</a> отличный от того, что задан партнеру при <a href="https://docs.payanyway.ru/marketplace/zaprosy-dlya-registracii-fl/identifikaciya-s-pomoshyu-monetaid/registraciya-marketpleisa">регистрации</a>.</p> | Url Encoded String | *http%3A%2F%2Fya.ru* |
| **key**                 | ApiKey полученный при регистрации в MonetaId                                                                                                                                                                                                                                                                                                                                                                                                                                | Url Encoded String | *site-x*             |
| **mode**                | <p>Требуемый тип идентификации (any, simple, full):</p><p><strong>any</strong> - можно проводить уприд и мобильное id</p><p><strong>full</strong> - только мобильное id</p><p><strong>simple</strong> - только уприд</p>                                                                                                                                                                                                                                                    | Url Encoded String | *any*                |
| **nonce**               | Число, использующееся для невозможности повторного использования одного и того же токена (см. ниже)                                                                                                                                                                                                                                                                                                                                                                         | Число              | *10201010*           |
| **unitId**              | Идентификатор профиля/юнита в НКО "Монета", для которого необходимо провести  идентификацию.                                                                                                                                                                                                                                                                                                                                                                                | Число              | *100500*             |
| **userEmail**           | E-mail Пользователя в системе маркетплейса для оповещения о статусе идентификации                                                                                                                                                                                                                                                                                                                                                                                           | Url Encoded Email  | *john%40acme.com*    |

При формировании `nonce` удобно использовать текущее время в секундах на момент формирования токена. Каждый новый `nonce` в новом токене, формирующийся для данного `unitId` должен быть строго больше предыдущего **для данного юнита** (т.е. nonce должен строго монотонно возрастать), иначе он будет отброшен как некорректный.&#x20;

Пример итогового информационного сообщения:

```javascript
key=partner123&mode=any&nonce=1601375468244&unitId=544&userEmail=pertov%40acme.com
```

### Формирование подписи

После того, как информационное сообщение сформировано, необходимо вычислить подпись/хеш с использованием общего секрета - `ApiSecret`.&#x20;

Алгоритм формирования:

1. Вычислить HMAC-SHA512 хеш используя пару (информационное сообщение, секрет).
2. Полученный массив байт перевести в строку в шестнадцатеричном представлении.

```javascript
// message - инф. сообщение
// secret  - секрет/apiSecret

signatureBytes  = hmac_sha512(message, secret)
signatureString = bytesToHex(signatureBytes)
```

После того, как подпись в виде hex-строки сформирована, необходимо добавить ее к информационному сообщению с ключом signature:

key=partner123\&nonce=1601375468244\&unitId=544\&userEmail=<pertov@acme.co>&#x6D;**\&signature=7d7b968768f664bcdbd67bbd4e3f59347b300226734ade68bed660ab7794522fe0e3e66ecdb211f746dae1c44681a306ee221f8706c63195607e525e979360**

Финальным шагом необходимо полученную строку (информационное сообщение + подпись) закодировать при помощи base64, использовать при перенаправлении на виджет идентификации.

```javascript
// СЕРВЕР
// на стороне сервера формируем итоговый токен
message = "key=partner123&mode=any&nonce=1601375468244&unitId=544&userEmail=pertov%40acme.com&signature=abc8ed8919d89d98d"
token   = base64(message)

// БРАУЗЕР КЛИЕНТА
// делаем редирект в браузере клиента на указанный адрес с этим токеном

// DEV окружение
https://mid-ui.dev.mnxsc.tech/?token={{token}}

// PROD окружение
https://mid-ui.prod.mnxsc.tech/?token={{token}}


```


---

# 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://docs.payanyway.ru/marketplace/zaprosy-dlya-registracii-fl/identifikaciya-s-pomoshyu-monetaid/autentifikaciya.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.
