Описание изменений
This commit is contained in:
84
backend/utils/auth.js
Normal file
84
backend/utils/auth.js
Normal file
@@ -0,0 +1,84 @@
|
||||
const { SiweMessage } = require('siwe');
|
||||
const { ethers } = require('ethers');
|
||||
const AccessTokenABI = require('../artifacts/contracts/AccessToken.sol/AccessToken.json').abi;
|
||||
require('dotenv').config();
|
||||
|
||||
const provider = new ethers.JsonRpcProvider(process.env.ETHEREUM_NETWORK_URL);
|
||||
const accessToken = new ethers.Contract(
|
||||
process.env.ACCESS_TOKEN_ADDRESS,
|
||||
AccessTokenABI,
|
||||
provider
|
||||
);
|
||||
|
||||
// Проверяем наличие адреса контракта
|
||||
if (!process.env.ACCESS_TOKEN_ADDRESS) {
|
||||
console.error('ACCESS_TOKEN_ADDRESS не указан в .env файле');
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет подпись сообщения
|
||||
* @param {Object} message - Сообщение для проверки
|
||||
* @param {string} signature - Подпись сообщения
|
||||
* @param {string} address - Адрес кошелька
|
||||
* @returns {Promise<boolean>} - Результат проверки
|
||||
*/
|
||||
async function verifySignature(message, signature, address) {
|
||||
try {
|
||||
// Формируем сообщение для проверки
|
||||
const domain = message.domain || window.location.host;
|
||||
const statement = message.statement || 'Sign in with Ethereum to the app.';
|
||||
const uri = message.uri || window.location.origin;
|
||||
const version = message.version || '1';
|
||||
const chainId = message.chainId || '1';
|
||||
const nonce = message.nonce;
|
||||
|
||||
const messageToVerify = `${domain} wants you to sign in with your Ethereum account:
|
||||
${address}
|
||||
|
||||
${statement}
|
||||
|
||||
URI: ${uri}
|
||||
Version: ${version}
|
||||
Chain ID: ${chainId}
|
||||
Nonce: ${nonce}
|
||||
`;
|
||||
|
||||
// Восстанавливаем адрес из подписи
|
||||
const recoveredAddress = ethers.verifyMessage(messageToVerify, signature);
|
||||
|
||||
return recoveredAddress.toLowerCase() === address.toLowerCase();
|
||||
} catch (error) {
|
||||
console.error('Signature verification error:', error);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
async function checkAccess(address) {
|
||||
// Временная заглушка
|
||||
return { hasAccess: false, role: null };
|
||||
}
|
||||
|
||||
async function verifyAndCheckAccess(message, signature, address) {
|
||||
// Проверяем подпись
|
||||
const verified = await verifySignature(message, signature, address);
|
||||
if (!verified) {
|
||||
return {
|
||||
verified: false,
|
||||
access: { hasAccess: false }
|
||||
};
|
||||
}
|
||||
|
||||
// Проверяем доступ
|
||||
const access = await checkAccess(address);
|
||||
|
||||
return {
|
||||
verified: true,
|
||||
access
|
||||
};
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
verifyAndCheckAccess,
|
||||
verifySignature,
|
||||
checkAccess
|
||||
};
|
||||
Reference in New Issue
Block a user