Защита REST-сервера на Delphi с использованием API-ключа в заголовках запросов
При разработке REST-серверов часто возникает необходимость ограничить доступ к API только авторизованным клиентам. В этой статье рассмотрим, как реализовать простую, но эффективную защиту с помощью API-ключа, передаваемого в заголовке HTTP-запроса, используя Delphi и компоненты REST.
Проблема доступа к REST-API
Как указано в исходном вопросе, разработчик хотел ограничить доступ к своему REST-серверу, чтобы данные могли получать только авторизованные клиентские приложения, а не любой пользователь с браузером.
Основные требования:
- Сервер должен отвечать только на запросы с правильным API-ключом
- Ключ должен передаваться в заголовке HTTP-запроса
- Реализация должна быть простой и эффективной для внутреннего использования
Решение: передача API-ключа в заголовке запроса
Клиентская часть (запрос с API-ключом)
Для отправки API-ключа с клиента нужно использовать метод AddAuthParameter компонента TRESTRequest:
procedure TForm2.btnGETPOSTClick(Sender: TObject);
var
strResponse: string;
begin
RestClient1.BaseURL := 'http://yourserver/api'; // Установка базового URL
// Добавление API-ключа в заголовок запроса
RestRequest1.AddAuthParameter('apikey', 'your-secret-key-123', pkHTTPHEADER);
// Выполнение запроса
RestRequest1.Execute;
try
strResponse := RestResponse1.Content;
memResp.Lines.Text := strResponse;
except
on E: Exception do
ShowMessage('Ошибка: ' + E.Message);
end;
end;
Серверная часть (проверка API-ключа)
На стороне сервера необходимо проверять наличие и корректность API-ключа:
procedure TWebModule1.WebModule1WebActionItemSiteOrdersGETAction(
Sender: TObject; Request: TWebRequest; Response: TWebResponse;
var Handled: Boolean);
var
authToken: string;
begin
// Получаем API-ключ из заголовка запроса
authToken := Request.GetFieldByName('apikey');
// Проверяем валидность ключа
if (authToken = '') or (authToken <> 'your-secret-key-123') then
begin
Response.Content := '{"error":"Invalid API key"}';
Response.StatusCode := 401; // Unauthorized
Handled := True;
Exit;
end;
// Если ключ верный - обрабатываем запрос
// ... ваш код обработки запроса ...
end;
Альтернативные решения
1. Использование параметров запроса
Вместо заголовков можно передавать API-ключ как параметр URL:
Однако этот метод менее безопасен, так как ключ может сохраняться в логах сервера и браузера.
2. Базовая HTTP-аутентификация
Можно использовать встроенную HTTP-аутентификацию:
// Клиент
RestClient1.Authenticator := THTTPBasicAuthenticator.Create('username', 'password');
// Сервер
if not AuthenticateUser(Request.Authorization) then
begin
Response.StatusCode := 401;
Response.WWWAuthenticate := 'Basic realm="MyServer"';
Handled := True;
Exit;
end;
3. JWT-токены
Для более сложных сценариев можно реализовать аутентификацию с помощью JSON Web Tokens:
// Генерация токена на сервере
function GenerateToken(userId: Integer): string;
var
jwt: TJWT;
begin
jwt := TJWT.Create;
try
jwt.Claims.IssuedAt := Now;
jwt.Claims.Expiration := Now + 1; // 1 день
jwt.Claims.JWTID := IntToStr(userId);
jwt.Claims.Issuer := 'MyServer';
Result := TJOSE.Sign('your-secret-key', jwt);
finally
jwt.Free;
end;
end;
// Проверка токена на сервере
function ValidateToken(const token: string): Boolean;
var
jwt: TJWT;
begin
try
jwt := TJOSE.Verify('your-secret-key', token);
try
Result := jwt.Verified and (jwt.Claims.Expiration > Now);
finally
jwt.Free;
end;
except
Result := False;
end;
end;
Рекомендации по безопасности
Храните ключи безопасно - не коммитьте их в репозиторий, используйте конфигурационные файлы
Используйте HTTPS - для защиты передаваемых данных
Ограничьте доступ по IP - если возможно, разрешайте запросы только с определенных IP-адресов
Регулярно меняйте ключи - установите политику регулярной смены API-ключей
Логируйте запросы - для мониторинга и выявления подозрительной активности
Заключение
Реализация простой аутентификации с помощью API-ключа в заголовках запросов - эффективное решение для защиты REST-сервера в Delphi. Метод AddAuthParameter компонента TRESTRequest предоставляет удобный способ добавления заголовков авторизации, а на стороне сервера проверка осуществляется с помощью GetFieldByName.
Для более сложных сценариев рассмотрите возможность использования JWT или OAuth-аутентификации. Помните, что безопасность API - критически важный аспект разработки, и даже для внутренних сервисов стоит применять базовые меры защиты.
Защита REST-сервера на Delphi с использованием API-ключа в заголовках HTTP-запросов для ограничения доступа только авторизованным клиентам.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS