Ответ
Да, передача авторизационных данных в HTTP-заголовках — это стандартная и широко используемая практика, особенно в REST API. Основные методы:
1. Базовая аутентификация (Basic Auth)
Логин и пароль, разделенные двоеточием, в кодировке Base64. Используйте ТОЛЬКО поверх HTTPS.
// Формирование заголовка на стороне клиента (например, в cURL)
$headers = [
'Authorization: Basic ' . base64_encode('username:password')
];
// Проверка на стороне сервера (PHP)
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My API"');
header('HTTP/1.0 401 Unauthorized');
exit;
}
$user = $_SERVER['PHP_AUTH_USER'];
$pass = $_SERVER['PHP_AUTH_PW'];
2. Аутентификация по токену (Bearer Token)
Наиболее распространенный способ для JWT (JSON Web Tokens) и OAuth 2.0.
// Клиент отправляет токен
$headers = [
'Authorization: Bearer eyJhbGciOiJIUzI1NiIs...'
];
// Сервер извлекает и проверяет токен
$authHeader = $_SERVER['HTTP_AUTHORIZATION'] ?? '';
if (preg_match('/Bearers+(S+)/', $authHeader, $matches)) {
$jwtToken = $matches[1];
// ... валидация и декодирование JWT
}
3. Кастомные заголовки с API-ключами
Часто используется для простого доступа к API.
$headers = [
'X-API-Key: your-secret-api-key-12345',
'X-Client-ID: client_app_001'
];
4. Аутентификация на основе хешей (HMAC)
Более безопасный способ, где в заголовке передается подпись запроса.
$apiKey = 'key';
$secret = 'secret';
$timestamp = time();
$payload = http_build_query($data);
$signature = hash_hmac('sha256', $payload . $timestamp, $secret);
$headers = [
'X-API-Key: ' . $apiKey,
'X-Signature: ' . $signature,
'X-Timestamp: ' . $timestamp
];
Критически важные меры безопасности:
- Всегда используйте HTTPS (TLS) для шифрования трафика.
- Никогда не передавайте токены, пароли или ключи в URL (например, как GET-параметр), так как они могут остаться в логах серверов и браузеров.
- Для веб-сессий предпочтительнее использовать защищенные куки с флагами
HttpOnlyиSecure. - Срок действия токенов должен быть ограничен, реализуйте механизм их обновления (refresh tokens).