Fix: Критические исправления SIWE верификации
- Добавлена проверка адреса после подписи на фронтенде - Добавлена проверка соответствия адреса в сообщении и подписи - Улучшено логирование на бэкенде для диагностики проблем - Исправлена проблема с несоответствием адресов при переключении кошелька
This commit is contained in:
@@ -60,18 +60,31 @@ class AuthService {
|
|||||||
// Логируем для отладки
|
// Логируем для отладки
|
||||||
logger.info(`[verifySignature] SIWE verification result: ${success}`);
|
logger.info(`[verifySignature] SIWE verification result: ${success}`);
|
||||||
if (data) {
|
if (data) {
|
||||||
logger.info(`[verifySignature] Verified address: ${data.address}`);
|
logger.info(`[verifySignature] Verified address from signature: ${data.address}`);
|
||||||
logger.info(`[verifySignature] Expected address: ${normalizedAddress}`);
|
logger.info(`[verifySignature] Address in message: ${message.address}`);
|
||||||
logger.info(`[verifySignature] Addresses match: ${ethers.getAddress(data.address) === normalizedAddress}`);
|
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}`);
|
logger.info(`[verifySignature] Signature: ${signature}`);
|
||||||
|
|
||||||
if (!success) {
|
if (!success) {
|
||||||
|
logger.error(`[verifySignature] SIWE verification failed. Success: ${success}, Data: ${JSON.stringify(data)}`);
|
||||||
return false;
|
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) {
|
} catch (error) {
|
||||||
logger.error('Error in SIWE signature verification:', error);
|
logger.error('Error in SIWE signature verification:', error);
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -153,6 +153,40 @@ export const connectWallet = async () => {
|
|||||||
|
|
||||||
// console.log('Got signature:', signature);
|
// 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...');
|
// console.log('Sending verification request...');
|
||||||
const requestData = {
|
const requestData = {
|
||||||
|
|||||||
Reference in New Issue
Block a user