3 минуты
Как обезопасить API-ключи с использованием серверных компонентов Next.js
Обзор
Мы можем использовать серверные компоненты Next.js, чтобы надёжно защитить наш API-ключ от утечки на стороне фронтенда в нашем dApp. Для дополнительной безопасности API-ключа мы также можем ограничить его использование определёнными субграфами или доменами в Subgraph Studio.
В этом руководстве мы рассмотрим, как создать серверный компонент Next.js, который выполняет запрос к субграфу, скрывая API-ключ от фронтенда.
Предостережения
- Серверные компоненты Next.js не защищают API-ключи от утечки при атаках типа “отказ в обслуживании”.
- Шлюзы The Graph Network имеют стратегии обнаружения и смягчения атак типа “отказ в обслуживании”, однако использование серверных компонентов может ослабить эти защиты.
- Серверные компоненты Next.js вносят риски централизации, так как сервер может выйти из строя.
Почему это необходимо
В стандартном React-приложении API-ключи, включённые в код внешнего интерфейса, могут быть раскрыты на стороне клиента, что созает угрозу безопасности. Хотя обычно используются файлы .env
, они не обеспечивают полной защиты ключей, так как код React выполняется на стороне клиента, раскрывая API-ключ в заголовках. Серверные компоненты Next.js решают эту проблему, обрабатывая конфиденциальные операции на сервере.
Использование рендеринга на стороне клиента для выполнения запроса к субграфу

Предварительные требования
- API-ключ от Subgraph Studio
- Базовые знания о Next.js и React.
- Существующий проект Next.js, который использует App Router.
Пошаговое руководство
Шаг 1: Настройка переменных среды
- В корневой папке нашего проекта Next.js создайте файл
.env.local
. - Добавьте наш API-ключ:
API_KEY=<api_key_here>
.
Шаг 2: Создание серверного компонента
- В директории
components
создайте новый файлServerComponent.js
. - Используйте приведённый пример кода для настройки серверного компонента.
Шаг 3: Реализация API-запроса на стороне сервера
В файл ServerComponent.js
добавьте следующий код:
1const API_KEY = process.env.API_KEY23export default async function ServerComponent() {4 const response = await fetch(5 `https://gateway-arbitrum.network.thegraph.com/api/${API_KEY}/subgraphs/id/HUZDsRpEVP2AvzDCyzDHtdc64dyDxx8FQjzsmqSg4H3B`,6 {7 method: 'POST',8 headers: {9 'Content-Type': 'application/json',10 },11 body: JSON.stringify({12 query: /* GraphQL */ `13 {14 factories(first: 5) {15 id16 poolCount17 txCount18 totalVolumeUSD19 }20 }21 `,22 }),23 },24 )2526 const responseData = await response.json()27 const data = responseData.data2829 return (30 <div>31 <h1>Server Component</h1>32 {data ? (33 <ul>34 {data.factories.map((factory) => (35 <li key={factory.id}>36 <p>ID: {factory.id}</p>37 <p>Pool Count: {factory.poolCount}</p>38 <p>Transaction Count: {factory.txCount}</p>39 <p>Total Volume USD: {factory.totalVolumeUSD}</p>40 </li>41 ))}42 </ul>43 ) : (44 <p>Loading data...</p>45 )}46 </div>47 )48}
Шаг 4: Использование серверного компонента
- В файл страницы (например,
pages/index.js
) импортируйтеServerComponent
. - Отрендерите компонент:
1import ServerComponent from './components/ServerComponent'23export default function Home() {4 return (5 <main>6 <ServerComponent />7 </main>8 )9}
Шаг 5: Запуск и тестирование нашего децентрализованного приложения (Dapp)
Запустите наше приложение Next.js с помощью команды npm run dev
. Убедитесь, что серверный компонент запрашивает данные, не раскрывая API-ключ.

Заключение
Используя серверные компоненты Next.js, мы эффективно скрыли ключ API от клиентской стороны, улучшив безопасность нашего приложения. Этот метод гарантирует, что чувствительные операции обрабатываются на сервере, вдали от потенциальных уязвимостей на стороне клиента. В заключение, не забудьте ознакомиться с другими мерами безопасности для ключей API, чтобы повысить уровень безопасности своего ключа API.