Перейти к содержимому
FidmosДокументация

Вход кошельком (SIWE)

Третий способ входа — подпись кошелька по стандарту SIWE (Sign-In with Ethereum). Эта страница описывает, что происходит внутри окна Fidmos, когда человек выбирает кошелёк: какие запросы уходят и какие бывают ошибки.

  1. Окно берёт одноразовый nonce — POST /api/v1/embed/siwe/nonce:

    POSThttps://id.fidmos.com/api/v1/embed/siwe/nonce
    Content-Type: application/json
    
    { "flow_id": "..." }
    { "nonce": "..." }
  2. Человек подписывает сообщение. Окно собирает SIWE-сообщение с этим nonce и просит кошелёк его подписать — подтверждение происходит в самом кошельке.

  3. Окно проверяет подпись — POST /api/v1/embed/siwe/verify:

    POSThttps://id.fidmos.com/api/v1/embed/siwe/verify
    Content-Type: application/json
    
    { "flow_id": "...", "message": "...", "signature": "0x..." }

    Сервер восстанавливает адрес из подписи, сверяет домен и сроки сообщения и гасит nonce. Не совпал nonce — nonce_mismatch; не прошла проверка сообщения или подписи — код из таблицы «Проверка подписи» ниже.

  4. Личность связывается с пользователем. Кошелёк уже привязан — поток готов к завершению ({ "status": "authenticated", "completion_handle": "..." }); ещё не привязан — окно получает identity_unlinked и заводит нового пользователя (POST /api/v1/embed/identity/create с тем же flow_id).

  5. Окно завершает вход — меняет completion_handle на код авторизации (POST /api/v1/embed/complete) и отдаёт его вашей странице через onSuccess. Дальше — обычный обмен кода на токен.

Все ответы с ошибкой — в конверте { "error": "<код>" }. Значения кодов и общий разбор — в справочнике ошибок.

Код Когда
nonce_mismatch nonce в сообщении не совпал с выданным
no_pending_identity нет отложенного способа входа для создания пользователя
identity_taken этот адрес успели привязать к другому пользователю
invalid_completion завершение потока не удалось (HTTP 409)
authorization_failed окно не смогло выпустить код авторизации
flow_expired поток не найден или истёк
parent_origin_mismatch запрос пришёл с чужого источника

Если проверка SIWE-сообщения или подписи не прошла, verify вернёт один из этих кодов (партнёр по ним не ветвится — для окна это общий исход «подпись не принята»):

Код Когда
malformed_message сообщение не разобралось по формату SIWE
message_too_long сообщение длиннее допустимого
bad_signature подпись не в том формате или не восстанавливается
signature_mismatch подпись не соответствует адресу в сообщении
malleable_signature подпись в «ковкой» форме (нарушен low-S)
unsupported_version версия SIWE не 1
unsupported_chain сеть не Ethereum mainnet
origin_mismatch uri сообщения не из разрешённых источников
domain_mismatch domain сообщения не совпал с его uri
stale_message метка времени вне допустимого окна
expired_message наступило Expiration Time сообщения
not_yet_valid ещё не наступило Not Before сообщения