Скрытие ваших учетных данных API на стороне клиента с помощью прокси-сервера в React

Скрытие ваших учетных данных API на стороне клиента с помощью прокси-сервера в React

17 ноября 2022 г.

Обычно я советую людям использовать запрос на стороне сервера для запроса GraphQL API. Это потому, что вы можете скрыть свой ключ API в коде на стороне сервера. Однако большинство приложений Jamstack требуют написания кода на стороне клиента, поэтому вы не можете использовать запрос на стороне сервера. Когда вы находитесь в такой ситуации, вы можете настроить прокси-сервер для внутреннего перенаправления ваших запросов API, скрывая запрос от пользователя. В этом посте я покажу вам, как скрыть ключ API с помощью прокси-сервера в React.

Создание прокси-сервера

Предположим, что у вас есть приложение React, использующее клиент Apollo для запроса API GraphQL, например API GraphQL StepZen. Конечная точка требует, чтобы вы предоставили ключ API в качестве заголовка, и его реализация в React будет выглядеть следующим образом:

const client = new ApolloClient({
  uri: 'https://YOUR_USERNAME.stepzen.net/api/YOUR_ENDPOINT/__graphql',
  cache: new InMemoryCache(),
  headers: {
    authorization: `apikey YOUR_API_KEY`,
  },
});

Когда вы используете этот клиент в своем приложении React для отправки запросов к GraphQL API, React выполнит запрос на стороне клиента. Это означает, что запрос виден на вкладке сети в браузере, и когда вы создаете приложение, которое используют внешние пользователи, они смогут увидеть этот ключ API.

К счастью, есть способы предотвратить это. Либо путем рендеринга вашего приложения React на стороне сервера, либо путем настройки прокси-сервера. Библиотека http-proxy-middleware — отличный инструмент, который можно использовать, когда вы хотите проксировать запросы к API. Для настройки и использования требуется всего пара строк кода, и это очень гибко. Вы можете использовать его для проксирования запросов к любому API, а не только к StepZen. Вы также можете использовать его для проксирования запросов к нескольким API.

В приведенном ниже блоке кода показано, как использовать http-proxy-middleware для проксирования запросов к API StepZen GraphQL. Например, когда вы используете приложение Create React (подробнее здесь), прокси-сервер настроен в файле с именем src/setProxy.js в корне вашего приложения React:

const { createProxyMiddleware } = require('http-proxy-middleware');

module.exports = function (app) {
  app.use(
    '/api/YOUR_ENDPOINT/__graphql',
    createProxyMiddleware({
      target: 'https://YOUR_USERNAME.stepzen.net',
      changeOrigin: true,
      headers: {
        authorization: 'apikey YOUR_API_KEY',
      },
    }),
  );
};

Или, что еще лучше, вы можете использовать пакет dotenv, чтобы сохранить ключ API в файле .env и использовать его на своем прокси-сервере. Таким образом, вы можете хранить свой ключ API в секрете, не беспокоясь о том, что он будет раскрыт в вашем коде. Пакет уже установлен в шаблоне create-react-app, поэтому вам не нужно устанавливать или импортировать его самостоятельно.

В файле .env вы можете сохранить свой ключ API следующим образом:

STEPZEN_API_KEY=YOUR_API_KEY

И используйте его в src/setupProxy.js:

authorization: `apikey ${process.ev.STEPZEN_API_KEY}`,

Теперь вы можете запускать приложение локально (с помощью npm start), чтобы сделать GraphQL API доступным по адресу http://localhost:3000/api/YOUR_ENDPOINT/__graphql. При запросе этой конечной точки или сокращенного api/YOUR_ENDPOINT/__graphql будет сделан запрос к https://YOUR_USERNAME.stepzen.net/api/YOUR_ENDPOINT/__graphql. через прокси-сервер. Прокси-сервер также добавит в запрос заголовок authorization, чтобы он не был доступен пользователю вашего приложения.

При использовании клиента Apollo или другого способа выполнения запросов GraphQL вы можете использовать тот же прокси-сервер для выполнения запросов к API StepZen:

const client = new ApolloClient({
  uri: '/api/YOUR_ENDPOINT/__graphql',
  cache: new InMemoryCache(),
});

Таким образом, вы можете отправлять запросы к API StepZen, не раскрывая свой ключ API пользователю вашего приложения.

Использование с Next.js

В этом примере показано, как использовать http-proxy-middleware с приложением Create React, но есть и другие примеры интеграции прокси-сервера с другими платформами и библиотеками. Например, Next.js, одна из самых популярных платформ React.

Для Next.js вы должны реализовать прокси-сервер с маршрутом API вместо src/setupProxy.js< /код>. Этот маршрут API будет назван в честь конечной точки GraphQL, на которую вы хотите настроить таргетинг. Предположим, вы хотите, чтобы прокси-сервер работал на http://YOUR_APP_URL/api/YOUR_ENDPOINT/__graphql. Затем вы должны создать файл с именем api/YOUR_ENDPOINT/__graphql.js и добавить следующий код:

import type { NextApiRequest, NextApiResponse } from 'next';
import { createProxyMiddleware } from 'http-proxy-middleware';

const proxyMiddleware = createProxyMiddleware({
  target: 'https://YOUR_USERNAME.stepzen.net',
  changeOrigin: true,
  headers: {
    authorization: 'apikey YOUR_API_KEY',
  }
});

export default function handler(req: NextApiRequest, res: NextApiResponse) {
  proxyMiddleware(req, res, (result: unknown) => {
    if (result instanceof Error) {
      throw result;
    }
  });
}

export const config = {
  api: {
    externalResolver: true,
  },
};

Теперь вы можете запустить свое приложение локально (с помощью npm run dev), и оно будет использовать ваш прокси-сервер для выполнения запросов к вашему API StepZen. Как и в примере с созданием приложения React, вы можете запросить GraphQL API по адресу http://localhost:3000/api/YOUR_ENDPOINT/__graphql (или сокращенно /api/YOUR_ENDPOINT/__graphql). ), и прокси-сервер перенаправит запрос на https://YOUR_USERNAME.stepzen.net/api/YOUR_ENDPOINT/__graphql, включая заголовок authorization.

Что дальше?

Вы также можете развернуть свое приложение в Netlify или Vercel, и оно будет использовать прокси-сервер для отправки запросов к вашему API StepZen. С этим небольшим прокси-сервером вам больше не нужно беспокоиться о возможном раскрытии вашего ключа API StepZen любому из пользователей вашего приложения. Дополнительные примеры доступны в документации по http-proxy-middleware.

:::информация Также опубликовано здесь.

:::


Оригинал