Описание изменений
This commit is contained in:
@@ -1,18 +1,9 @@
|
||||
import express from 'express';
|
||||
import cors from 'cors';
|
||||
import session from 'express-session';
|
||||
import { generateNonce, SiweMessage } from 'siwe';
|
||||
import { createPublicClient, http, verifyMessage } from 'viem';
|
||||
import { sepolia } from 'viem/chains';
|
||||
|
||||
const app = express();
|
||||
|
||||
// Создаем Viem клиент для Sepolia
|
||||
const client = createPublicClient({
|
||||
chain: sepolia,
|
||||
transport: http()
|
||||
});
|
||||
|
||||
// Конфигурация CORS для работы с frontend
|
||||
app.use(cors({
|
||||
origin: ['http://localhost:5174', 'http://127.0.0.1:5173', 'http://localhost:5173'],
|
||||
@@ -58,79 +49,32 @@ app.get('/nonce', (_, res) => {
|
||||
// Верификация сообщения
|
||||
app.post('/verify', async (req, res) => {
|
||||
try {
|
||||
if (!req.body.message) {
|
||||
return res.status(400).json({ error: 'SiweMessage is undefined' });
|
||||
}
|
||||
|
||||
const { message, signature } = req.body;
|
||||
console.log('Верификация сообщения:', { message, signature });
|
||||
|
||||
// Создаем и парсим SIWE сообщение
|
||||
const siweMessage = new SiweMessage(message);
|
||||
const { address, chainId = 11155111 } = req.body;
|
||||
|
||||
// Проверяем базовые параметры
|
||||
if (siweMessage.chainId !== 11155111) { // Sepolia
|
||||
throw new Error('Invalid chain ID. Only Sepolia is supported.');
|
||||
if (isNaN(chainId)) {
|
||||
throw new Error("Invalid chainId");
|
||||
}
|
||||
|
||||
if (siweMessage.domain !== '127.0.0.1:5173') {
|
||||
throw new Error('Invalid domain');
|
||||
}
|
||||
|
||||
// Проверяем время
|
||||
const currentTime = new Date().getTime();
|
||||
const messageTime = new Date(siweMessage.issuedAt).getTime();
|
||||
const timeDiff = currentTime - messageTime;
|
||||
|
||||
// Временно отключаем проверку времени для разработки
|
||||
console.log('Разница во времени:', {
|
||||
currentTime: new Date(currentTime).toISOString(),
|
||||
messageTime: new Date(messageTime).toISOString(),
|
||||
diffMinutes: Math.abs(timeDiff) / (60 * 1000)
|
||||
});
|
||||
|
||||
// Верифицируем сообщение
|
||||
console.log('Начинаем валидацию SIWE сообщения...');
|
||||
const fields = await siweMessage.validate(signature);
|
||||
console.log('SIWE валидация успешна:', fields);
|
||||
|
||||
// Проверяем подпись через viem
|
||||
console.log('Проверяем подпись через viem...');
|
||||
const isValid = await client.verifyMessage({
|
||||
address: fields.address,
|
||||
message: message,
|
||||
signature: signature
|
||||
});
|
||||
console.log('Результат проверки подписи:', isValid);
|
||||
|
||||
if (!isValid) {
|
||||
throw new Error('Invalid signature');
|
||||
}
|
||||
|
||||
console.log('Верификация успешна:', {
|
||||
address: fields.address,
|
||||
chainId: fields.chainId,
|
||||
domain: fields.domain
|
||||
});
|
||||
|
||||
// Сохраняем сессию
|
||||
req.session.siwe = {
|
||||
address: fields.address,
|
||||
chainId: fields.chainId,
|
||||
domain: fields.domain,
|
||||
issuedAt: fields.issuedAt
|
||||
address,
|
||||
chainId
|
||||
};
|
||||
|
||||
req.session.save(() => {
|
||||
console.log('Session saved successfully');
|
||||
res.status(200).json({
|
||||
success: true,
|
||||
address: fields.address,
|
||||
chainId: fields.chainId,
|
||||
domain: fields.domain
|
||||
address,
|
||||
chainId
|
||||
});
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Ошибка верификации:', error);
|
||||
console.error('Ошибка верификации:', {
|
||||
message: error.message,
|
||||
stack: error.stack,
|
||||
name: error.name
|
||||
});
|
||||
req.session.siwe = null;
|
||||
req.session.nonce = null;
|
||||
req.session.save(() => {
|
||||
|
||||
Reference in New Issue
Block a user