From b68449d52b337f7443dc6be3ee1fc126de8d8947 Mon Sep 17 00:00:00 2001 From: Alex Date: Thu, 27 Nov 2025 12:44:28 +0300 Subject: [PATCH] =?UTF-8?q?Fix:=20=D0=9A=D1=80=D0=B8=D1=82=D0=B8=D1=87?= =?UTF-8?q?=D0=B5=D1=81=D0=BA=D0=B8=D0=B5=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20SIWE=20=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавлена проверка адреса после подписи на фронтенде - Добавлена проверка соответствия адреса в сообщении и подписи - Улучшено логирование на бэкенде для диагностики проблем - Исправлена проблема с несоответствием адресов при переключении кошелька --- backend/services/auth-service.js | 23 ++++++++++++++++----- frontend/src/utils/wallet.js | 34 ++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 5 deletions(-) diff --git a/backend/services/auth-service.js b/backend/services/auth-service.js index c705d66..c23a8a1 100644 --- a/backend/services/auth-service.js +++ b/backend/services/auth-service.js @@ -60,18 +60,31 @@ class AuthService { // Логируем для отладки logger.info(`[verifySignature] SIWE verification result: ${success}`); if (data) { - logger.info(`[verifySignature] Verified address: ${data.address}`); - logger.info(`[verifySignature] Expected address: ${normalizedAddress}`); - logger.info(`[verifySignature] Addresses match: ${ethers.getAddress(data.address) === normalizedAddress}`); + logger.info(`[verifySignature] Verified address from signature: ${data.address}`); + logger.info(`[verifySignature] Address in message: ${message.address}`); + logger.info(`[verifySignature] Expected address (from request): ${normalizedAddress}`); + logger.info(`[verifySignature] Signature address matches message address: ${ethers.getAddress(data.address) === ethers.getAddress(message.address)}`); + logger.info(`[verifySignature] Signature address matches request address: ${ethers.getAddress(data.address) === normalizedAddress}`); } logger.info(`[verifySignature] Signature: ${signature}`); if (!success) { + logger.error(`[verifySignature] SIWE verification failed. Success: ${success}, Data: ${JSON.stringify(data)}`); return false; } - // Сравниваем нормализованные адреса - return data && ethers.getAddress(data.address) === normalizedAddress; + // КРИТИЧЕСКАЯ ПРОВЕРКА: Адрес из подписи должен совпадать с адресом в сообщении + if (data && message.address && ethers.getAddress(data.address) !== ethers.getAddress(message.address)) { + logger.error(`[verifySignature] КРИТИЧЕСКАЯ ОШИБКА: Адрес из подписи (${data.address}) не совпадает с адресом в сообщении (${message.address})!`); + return false; + } + + // Сравниваем нормализованные адреса: адрес из подписи должен совпадать с адресом из запроса + const addressesMatch = data && ethers.getAddress(data.address) === normalizedAddress; + if (!addressesMatch) { + logger.error(`[verifySignature] Адрес из подписи (${data.address}) не совпадает с адресом из запроса (${normalizedAddress})!`); + } + return addressesMatch; } catch (error) { logger.error('Error in SIWE signature verification:', error); return false; diff --git a/frontend/src/utils/wallet.js b/frontend/src/utils/wallet.js index 8d734d2..f6961b2 100644 --- a/frontend/src/utils/wallet.js +++ b/frontend/src/utils/wallet.js @@ -153,6 +153,40 @@ export const connectWallet = async () => { // console.log('Got signature:', signature); + // КРИТИЧЕСКАЯ ПРОВЕРКА: Убеждаемся, что адрес не изменился после подписи + const finalAccounts = await window.ethereum.request({ method: 'eth_accounts' }); + if (!finalAccounts || finalAccounts.length === 0) { + return { + success: false, + error: 'Кошелек отключен. Пожалуйста, подключите кошелек и попробуйте снова.', + }; + } + + const finalAddress = ethers.getAddress ? ethers.getAddress(finalAccounts[0]) : ethers.utils.getAddress(finalAccounts[0]); + + // Проверяем, что адрес совпадает с тем, который использовался для подписи + if (ethers.getAddress(finalAddress) !== ethers.getAddress(currentAddress)) { + console.error('❌ [Frontend] КРИТИЧЕСКАЯ ОШИБКА: Адрес кошелька изменился после подписи!'); + console.error(' Адрес при подписи:', currentAddress); + console.error(' Текущий адрес:', finalAddress); + return { + success: false, + error: 'Адрес кошелька изменился после подписи. Пожалуйста, попробуйте снова.', + }; + } + + // Проверяем, что адрес в сообщении совпадает с адресом, который подписывает + const messageAddress = message.address; + if (ethers.getAddress(messageAddress) !== ethers.getAddress(currentAddress)) { + console.error('❌ [Frontend] КРИТИЧЕСКАЯ ОШИБКА: Адрес в сообщении не совпадает с адресом подписи!'); + console.error(' Адрес в сообщении:', messageAddress); + console.error(' Адрес подписи:', currentAddress); + return { + success: false, + error: 'Несоответствие адресов в сообщении и подписи. Пожалуйста, попробуйте снова.', + }; + } + // Отправляем верификацию на сервер // console.log('Sending verification request...'); const requestData = {