Пользователь XZEN это аккаунт зарегистрированный в блокчейне XZEN.
Пример данных в бч.
{
"id": "1.2.17",
"membership_expiration_date": "1969-12-31T23:59:59",
"registrar": "1.2.17",
"referrer": "1.2.17",
"lifetime_referrer": "1.2.17",
"network_fee_percentage": 2000,
"lifetime_referrer_fee_percentage": 8000,
"referrer_rewards_percentage": 0,
"name": "nathan",
"owner": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [[
"XZEN5QKLKJL5YHtCSkey95FCxhcUSg1fr4N9Ke8CdS5AKVnZCwr3gS",
1
]
],
"address_auths": []
},
"active": {
"weight_threshold": 1,
"account_auths": [],
"key_auths": [[
"XZEN5QKLKJL5YHtCSkey95FCxhcUSg1fr4N9Ke8CdS5AKVnZCwr3gS",
1
]
],
"address_auths": []
},
"options": {
"memo_key": "XZEN5QKLKJL5YHtCSkey95FCxhcUSg1fr4N9Ke8CdS5AKVnZCwr3gS",
"voting_account": "1.2.5",
"num_witness": 0,
"num_committee": 0,
"votes": [],
"extensions": []
},
"statistics": "2.6.17",
"whitelisting_accounts": [],
"blacklisting_accounts": [],
"whitelisted_accounts": [],
"blacklisted_accounts": [],
"cashback_vb": "1.13.8",
"owner_special_authority": [
0,{}
],
"active_special_authority": [
0,{}
],
"top_n_control_flags": 0
}
Параметр | Описание |
---|---|
id | идентификатор аккаунта |
name | человекочитаемое имя аккаунта |
owner | настройки доступа владельца (позволяет менять ключи) |
active | настройки доступа пользования (позволяет исполнять операции) |
options | дополнительные настройки, там же задается memo ключ |
owner и active - это гибкая и сложная система управления доступом к аккаунту. Там могут задаваться как ключи, так и имена других пользователей
Поэтому для аутентификации на стороннем сервисе (для ее упрощения), можно использовать memo ключ. Он задается единственным, используется для шифрования сообщений при переводе.
Аутентификация по мемо ключу работает таким же образом, как валидирующие ноды проверяют транзакции - т.е. пользователь подписывает запросы к сервису используя свой ключ. Сервис проверяет подпись спрашивая у бч текущий публичный ключ пользователя и сверяет подпись.
Пользователь, владеющий текущим private_memo_key
Генерирует подпись
signature = sign(private_memo_key, action + params + timestamp)
И отправляет ее вместе в запросом на сервис
id, action, params, timestamp, signature
Получая запрос с данными от пользователя сервис:
Получает у бч текущий memo ключ пользователя - public_memo_key
и валидирует подпись
isValid = verify(public_memo_key, action + params + timestamp, signature)
если подпись валидна и timestamp не старее 5 минут, то одобряет запрос
АУТЕНТИФИЦИРОВАТЬ ПОЛЬЗОВАТЕЛЯ НУЖНО ТОЛЬКО В ЗАПРОСАХ НА ИЗМЕНЕНИЕ ДАННЫХ, чтение проходит без аутентификации
Использование все той же подписи, но подписывать только текущий timestamp.
т.к. пользователь общается с нами по зашифрованному каналу, то злоумышленник в целом не залезет в него. А нам всего лишь нужно убедиться что мы общаемся действительно с пользователем.
т.е.
signature = sign(private_memo_key, timestamp)
isValid = verify(public_memo_key, timestamp, signature)