Описание изменений
This commit is contained in:
28
backend/config/default.js
Normal file
28
backend/config/default.js
Normal file
@@ -0,0 +1,28 @@
|
||||
import dotenv from 'dotenv';
|
||||
dotenv.config();
|
||||
|
||||
export default {
|
||||
port: process.env.PORT || 3000,
|
||||
ethereumNetwork: {
|
||||
url: process.env.ETHEREUM_NETWORK_URL,
|
||||
privateKey: process.env.PRIVATE_KEY
|
||||
},
|
||||
etherscan: {
|
||||
apiKey: process.env.ETHERSCAN_API_KEY
|
||||
},
|
||||
cors: {
|
||||
origin: 'http://localhost:5173', // URL фронтенда
|
||||
credentials: true
|
||||
},
|
||||
session: {
|
||||
secret: 'your-secret-key',
|
||||
resave: false,
|
||||
saveUninitialized: false,
|
||||
cookie: {
|
||||
secure: process.env.NODE_ENV === 'production',
|
||||
sameSite: process.env.NODE_ENV === 'production' ? 'none' : 'lax',
|
||||
maxAge: 24 * 60 * 60 * 1000 // 24 часа
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
@@ -1,14 +0,0 @@
|
||||
require('dotenv').config();
|
||||
const express = require('express');
|
||||
const { ethers } = require('ethers');
|
||||
|
||||
const app = express();
|
||||
const port = process.env.PORT || 3000;
|
||||
|
||||
app.get('/', (req, res) => {
|
||||
res.send('Добро пожаловать в DApp-for-Business API');
|
||||
});
|
||||
|
||||
app.listen(port, () => {
|
||||
console.log(`Сервер запущен на http://localhost:${port}`);
|
||||
});
|
||||
4
backend/middleware/auth.js
Normal file
4
backend/middleware/auth.js
Normal file
@@ -0,0 +1,4 @@
|
||||
export const authMiddleware = (req, res, next) => {
|
||||
// Логика аутентификации
|
||||
next();
|
||||
};
|
||||
@@ -15,11 +15,11 @@
|
||||
"@nomiclabs/hardhat-ethers": "^2.0.0",
|
||||
"@nomiclabs/hardhat-waffle": "^2.0.0",
|
||||
"cors": "^2.8.5",
|
||||
"ethers": "^5.0.0",
|
||||
"ethers": "^5.7.2",
|
||||
"express": "^4.21.2",
|
||||
"express-session": "^1.18.1",
|
||||
"hardhat": "^2.9.3",
|
||||
"siwe": "^3.0.0",
|
||||
"siwe": "^2.1.4",
|
||||
"viem": "^2.23.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
||||
8
backend/routes/api.js
Normal file
8
backend/routes/api.js
Normal file
@@ -0,0 +1,8 @@
|
||||
import express from 'express';
|
||||
const router = express.Router();
|
||||
|
||||
router.post('/verify', async (req, res) => {
|
||||
// Логика верификации
|
||||
});
|
||||
|
||||
export default router;
|
||||
@@ -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(() => {
|
||||
|
||||
@@ -861,13 +861,15 @@
|
||||
"@sentry/types" "5.30.0"
|
||||
tslib "^1.9.3"
|
||||
|
||||
"@spruceid/siwe-parser@^3.0.0":
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@spruceid/siwe-parser/-/siwe-parser-3.0.0.tgz#8af48683d77aed6dbd1abf541e1b064dc64be10e"
|
||||
integrity sha512-Y92k63ilw/8jH9Ry4G2e7lQd0jZAvb0d/Q7ssSD0D9mp/Zt2aCXIc3g0ny9yhplpAx1QXHsMz/JJptHK/zDGdw==
|
||||
"@spruceid/siwe-parser@^2.1.2":
|
||||
version "2.1.2"
|
||||
resolved "https://registry.yarnpkg.com/@spruceid/siwe-parser/-/siwe-parser-2.1.2.tgz#3e13e7d3ac0bfdaf109a07342590eb21daee2fc3"
|
||||
integrity sha512-d/r3S1LwJyMaRAKQ0awmo9whfXeE88Qt00vRj91q5uv5ATtWIQEGJ67Yr5eSZw5zp1/fZCXZYuEckt8lSkereQ==
|
||||
dependencies:
|
||||
"@noble/hashes" "^1.1.2"
|
||||
apg-js "^4.4.0"
|
||||
apg-js "^4.3.0"
|
||||
uri-js "^4.4.1"
|
||||
valid-url "^1.0.9"
|
||||
|
||||
"@stablelib/binary@^1.0.1":
|
||||
version "1.0.1"
|
||||
@@ -1251,7 +1253,7 @@ anymatch@~3.1.2:
|
||||
normalize-path "^3.0.0"
|
||||
picomatch "^2.0.4"
|
||||
|
||||
apg-js@^4.4.0:
|
||||
apg-js@^4.3.0:
|
||||
version "4.4.0"
|
||||
resolved "https://registry.yarnpkg.com/apg-js/-/apg-js-4.4.0.tgz#09dcecab0731fbde233b9f2352fdd2d07e56b2cf"
|
||||
integrity sha512-fefmXFknJmtgtNEXfPwZKYkMFX4Fyeyz+fNF6JWp87biGOPslJbCBVU158zvKRZfHBKnJDy8CMM40oLFGkXT8Q==
|
||||
@@ -2108,7 +2110,7 @@ ethereumjs-util@^7.1.1, ethereumjs-util@^7.1.3, ethereumjs-util@^7.1.4, ethereum
|
||||
ethereum-cryptography "^0.1.3"
|
||||
rlp "^2.2.4"
|
||||
|
||||
ethers@^5.0.0:
|
||||
ethers@^5.7.2:
|
||||
version "5.7.2"
|
||||
resolved "https://registry.yarnpkg.com/ethers/-/ethers-5.7.2.tgz#3a7deeabbb8c030d4126b24f84e525466145872e"
|
||||
integrity sha512-wswUsmWo1aOK8rR7DIKiWSw9DbLWe6x98Jrn8wcTflTVvaXhAMaB5zGAXy0GYQEQp9iO1iSHWVyARQm11zUtyg==
|
||||
@@ -3659,13 +3661,15 @@ side-channel@^1.0.6, side-channel@^1.1.0:
|
||||
side-channel-map "^1.0.1"
|
||||
side-channel-weakmap "^1.0.2"
|
||||
|
||||
siwe@^3.0.0:
|
||||
version "3.0.0"
|
||||
resolved "https://registry.yarnpkg.com/siwe/-/siwe-3.0.0.tgz#0508c3fca521c476a07d907a9b5b96a03c27c0f2"
|
||||
integrity sha512-P2/ry7dHYJA6JJ5+veS//Gn2XDwNb3JMvuD6xiXX8L/PJ1SNVD4a3a8xqEbmANx+7kNQcD8YAh1B9bNKKvRy/g==
|
||||
siwe@^2.1.4:
|
||||
version "2.3.2"
|
||||
resolved "https://registry.yarnpkg.com/siwe/-/siwe-2.3.2.tgz#0794ae25f734f3068de0ab093ddd2f7867bc2d67"
|
||||
integrity sha512-aSf+6+Latyttbj5nMu6GF3doMfv2UYj83hhwZgUF20ky6fTS83uVhkQABdIVnEuS8y1bBdk7p6ltb9SmlhTTlA==
|
||||
dependencies:
|
||||
"@spruceid/siwe-parser" "^3.0.0"
|
||||
"@spruceid/siwe-parser" "^2.1.2"
|
||||
"@stablelib/random" "^1.0.1"
|
||||
uri-js "^4.4.1"
|
||||
valid-url "^1.0.9"
|
||||
|
||||
solc@0.8.15:
|
||||
version "0.8.15"
|
||||
@@ -3974,7 +3978,7 @@ unpipe@1.0.0, unpipe@~1.0.0:
|
||||
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
|
||||
integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
|
||||
|
||||
uri-js@^4.2.2:
|
||||
uri-js@^4.2.2, uri-js@^4.4.1:
|
||||
version "4.4.1"
|
||||
resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e"
|
||||
integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
|
||||
@@ -4016,6 +4020,11 @@ uuid@^8.3.2:
|
||||
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
|
||||
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
|
||||
|
||||
valid-url@^1.0.9:
|
||||
version "1.0.9"
|
||||
resolved "https://registry.yarnpkg.com/valid-url/-/valid-url-1.0.9.tgz#1c14479b40f1397a75782f115e4086447433a200"
|
||||
integrity sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==
|
||||
|
||||
vary@^1, vary@~1.1.2:
|
||||
version "1.1.2"
|
||||
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
|
||||
@@ -4031,9 +4040,9 @@ verror@1.10.0:
|
||||
extsprintf "^1.2.0"
|
||||
|
||||
viem@^2.23.2:
|
||||
version "2.23.2"
|
||||
resolved "https://registry.yarnpkg.com/viem/-/viem-2.23.2.tgz#db395c8cf5f4fb5572914b962fb8ce5db09f681c"
|
||||
integrity sha512-NVmW/E0c5crMOtbEAqMF0e3NmvQykFXhLOc/CkLIXOlzHSA6KXVz3CYVmaKqBF8/xtjsjHAGjdJN3Ru1kFJLaA==
|
||||
version "2.23.3"
|
||||
resolved "https://registry.yarnpkg.com/viem/-/viem-2.23.3.tgz#3b8af9490f8f453a17e849d774bea1b5c992738c"
|
||||
integrity sha512-ON/Uybteajqxn3iFyhV/6Ybm+QKhcrsVyTZf/9v2w0CvYQIoyJYCfHSsQR9zpsbOGrR7d2p62w6jzb6fqzzacg==
|
||||
dependencies:
|
||||
"@noble/curves" "1.8.1"
|
||||
"@noble/hashes" "1.7.1"
|
||||
|
||||
Reference in New Issue
Block a user