Описание изменений
This commit is contained in:
89
backend/utils/access-check.js
Normal file
89
backend/utils/access-check.js
Normal file
@@ -0,0 +1,89 @@
|
||||
const { ethers } = require('ethers');
|
||||
require('dotenv').config();
|
||||
const contractArtifact = require('../artifacts/contracts/MyContract.sol/MyContract.json');
|
||||
const contractABI = contractArtifact.abi;
|
||||
|
||||
// Проверяем наличие необходимых переменных окружения
|
||||
if (!process.env.ACCESS_TOKEN_ADDRESS) {
|
||||
console.error('ACCESS_TOKEN_ADDRESS не указан в .env файле');
|
||||
}
|
||||
|
||||
if (!process.env.ETHEREUM_NETWORK_URL) {
|
||||
console.error('ETHEREUM_NETWORK_URL не указан в .env файле');
|
||||
}
|
||||
|
||||
// Подключение к контракту
|
||||
const provider = new ethers.JsonRpcProvider(process.env.ETHEREUM_NETWORK_URL);
|
||||
let accessToken;
|
||||
|
||||
try {
|
||||
const AccessTokenABI = require('../artifacts/contracts/AccessToken.sol/AccessToken.json').abi;
|
||||
accessToken = new ethers.Contract(
|
||||
process.env.ACCESS_TOKEN_ADDRESS,
|
||||
AccessTokenABI,
|
||||
provider
|
||||
);
|
||||
} catch (error) {
|
||||
console.error('Ошибка инициализации контракта AccessToken:', error);
|
||||
}
|
||||
|
||||
/**
|
||||
* Проверяет доступ и роль пользователя
|
||||
* @param {string} address - Ethereum адрес пользователя
|
||||
* @returns {Promise<{hasAccess: boolean, role: string|null}>}
|
||||
*/
|
||||
async function checkAccess(address) {
|
||||
try {
|
||||
if (!address || !accessToken) {
|
||||
return { hasAccess: false, role: null };
|
||||
}
|
||||
|
||||
// Проверяем активный токен
|
||||
const activeTokenId = await accessToken.activeTokens(address);
|
||||
if (activeTokenId.toString() === '0') {
|
||||
return { hasAccess: false, role: null };
|
||||
}
|
||||
|
||||
// Получаем роль
|
||||
const roleId = await accessToken.checkRole(address);
|
||||
const roles = ['ADMIN', 'MODERATOR', 'SUPPORT'];
|
||||
const role = roles[roleId];
|
||||
|
||||
return {
|
||||
hasAccess: true,
|
||||
role,
|
||||
tokenId: activeTokenId.toString()
|
||||
};
|
||||
} catch (error) {
|
||||
console.error('Access check error:', error);
|
||||
return { hasAccess: false, role: null };
|
||||
}
|
||||
}
|
||||
|
||||
async function checkAdmin(address) {
|
||||
try {
|
||||
console.log('Проверка прав администратора для адреса:', address);
|
||||
// Проверяем, является ли пользователь администратором через смарт-контракт
|
||||
const contract = new ethers.Contract(
|
||||
process.env.CONTRACT_ADDRESS,
|
||||
contractABI,
|
||||
provider
|
||||
);
|
||||
|
||||
console.log('Контракт инициализирован:', {
|
||||
address: process.env.CONTRACT_ADDRESS,
|
||||
provider: provider.connection.url
|
||||
});
|
||||
|
||||
const isAdmin = await contract.isAdmin(address);
|
||||
console.log('Результат проверки из контракта:', isAdmin);
|
||||
|
||||
return isAdmin;
|
||||
} catch (error) {
|
||||
console.error('Ошибка при проверке прав администратора:', error);
|
||||
// В случае ошибки возвращаем false вместо выброса исключения
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { checkAccess, checkAdmin };
|
||||
Reference in New Issue
Block a user