Методы HTTP авторизации с использованием PHP cURL
Основные и альтернативные методы авторизации
Библиотека cURL в PHP предоставляет гибкие возможности для аутентификации HTTP запросов. Ниже рассмотрен основной способ с Bearer токеном, а также альтернативные варианты для различных сценариев.
Как выполнить авторизацию с помощью Bearer токена?
Bearer токен (часто используется в OAuth 2.0) передается в заголовке Authorization: Bearer <token>. Это наиболее распространенный метод для современных REST API.
<?php
$ch = curl_init('https://api.example.com/resource');
$token = 'eyJhbGciOiJIUzI1NiIs...';
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $token,
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if (curl_errno($ch)) {
echo 'Ошибка cURL: ' . curl_error($ch);
} else {
echo "HTTP код: $httpCode\n";
echo "Ответ: $response";
}
curl_close($ch);
?>
Php curl timeout (php curl таймаут)
Пояснения: токен обычно получается отдельно через endpoint авторизации. В примере установлен заголовок с токеном и типом контента. Функция curl_exec выполняет запрос, а curl_getinfo возвращает HTTP статус.
- Токен может быть просрочен – необходимо реализовать обновление.
- Некорректный заголовок (лишние пробелы, кавычки).
- Отсутствие HTTPS – токен передается в открытом виде.
Цели использования: доступ к API, требующим Bearer аутентификацию (например, Stripe, GitHub, Google APIs).
Как настроить Basic-авторизацию?
Basic авторизация передает логин и пароль в заголовке Authorization в закодированном виде (base64). Подходит для простых внутренних сервисов, но требует HTTPS.
<?php
$ch = curl_init('https://api.example.com/login');
$username = 'user';
$password = 'pass';
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
?>
Php curl ssl (php curl ssl)
Опция CURLOPT_USERPWD автоматически формирует заголовок. Если необходимо кастомное кодирование, можно задать вручную через CURLOPT_HTTPHEADER.
- Использование HTTP вместо HTTPS – пароль передается открытым текстом.
- Специальные символы в пароле (двоеточие) – экранирование или encode.
Случаи использования: API с базовой аутентификацией (например, некоторые почтовые сервисы, Jenkins).
Как использовать Digest-авторизацию?
Digest авторизация использует хеш для защиты пароля. Для cURL достаточно указать тип аутентификации.
<?php
$ch = curl_init('https://api.example.com/digest');
curl_setopt($ch, CURLOPT_USERPWD, 'user:pass');
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
?>
Php curl ответ (ответ php curl)
Константа CURLAUTH_DIGEST заставляет cURL использовать Digest-схему. cURL сама обрабатывает handshake.
- Не все серверы правильно реализуют Digest – возможны ошибки nonce.
- Необходимо убедиться, что сервер поддерживает Digest.
Как авторизоваться через OAuth 2.0 Password Grant?
Этот поток позволяет получить токен с помощью логина и пароля. Токен затем используется как Bearer.
<?php
$url = 'https://auth.example.com/token';
$data = [
'grant_type' => 'password',
'username' => 'user',
'password' => 'pass',
'client_id' => 'your_client_id',
'client_secret' => 'your_client_secret'
];
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/x-www-form-urlencoded']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$result = json_decode($response, true);
$accessToken = $result['access_token'] ?? null;
?>
Php curl authorization (php curl авторизация)
После получения токена его можно использовать в последующих запросах с Bearer заголовком.
- Неверный client_id или secret – ответ с ошибкой invalid_client.
- Необходимо проверять код ответа и наличие access_token.
Как отправить запрос с NTLM-аутентификацией?
NTLM используется в корпоративных средах (например, SharePoint, Exchange). Для активации нужно указать тип аутентификации и учетные данные.
<?php
$ch = curl_init('https://exchange.company.com/mail');
curl_setopt($ch, CURLOPT_USERPWD, 'DOMAIN\\user:pass');
curl_setopt($ch, CURLOPT_HTTPAUTH, CURLAUTH_NTLM);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
?>
Php curl close (php curl close)
Важно: обратные слэши в домене могут потребовать экранирования в PHP-строках. Также может понадобиться опция CURLOPT_UNRESTRICTED_AUTH.
- Требуется библиотека cURL, собранная с поддержкой NTLM (обычно включена).
- Некорректный формат домена – ошибка 'NTLM authentication failed'.
Как передать сессионные куки для авторизации?
Некоторые системы используют сессионные куки после входа. Для работы с ними cURL предоставляет файловые хранилища (cookie jar).
<?php
$cookieFile = '/tmp/cookies.txt';
// Шаг 1: логин и сохранение куки
$ch = curl_init('https://site.com/login');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'user=login&pass=123');
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
curl_close($ch);
// Шаг 2: запрос с сохраненными куками
$ch2 = curl_init('https://site.com/private');
curl_setopt($ch2, CURLOPT_COOKIEFILE, $cookieFile);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch2);
?>
Куки автоматически загружаются из файла. Для параллельных запросов используйте разные файлы.
- Отсутствие прав на запись/чтение файла кук.
- Неверный путь к файлу или его удаление между запросами.
Общие рекомендации: всегда проверять HTTP код ответа и наличие ошибок cURL. Использовать HTTPS для всех авторизованных запросов. Для сложных сценариев рекомендуется оборачивать логику в классы.
Расширенные примеры авторизации через cURL
Пример 1. OAuth 2.0 Client Credentials с повторными попытками
<?php
function getTokenWithRetry($url, $clientId, $clientSecret, $maxRetries = 3) {
$attempt = 0;
while ($attempt < $maxRetries) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
'grant_type' => 'client_credentials',
'client_id' => $clientId,
'client_secret' => $clientSecret
]));
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Content-Type: application/x-www-form-urlencoded']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$error = curl_error($ch);
curl_close($ch);
if ($httpCode == 200) {
$data = json_decode($response, true);
if (isset($data['access_token'])) {
return $data['access_token'];
}
}
$attempt++;
if ($attempt < $maxRetries) {
usleep(1000000); // 1 sec delay
}
}
throw new Exception('Не удалось получить токен после ' . $maxRetries . ' попыток');
}
$token = getTokenWithRetry('https://auth.example.com/token', 'client1', 'secret1');
echo "Токен: " . substr($token, 0, 20) . "...\n";
?>
Токен: eyJhbGciOiJSUzI1NiIs...
Пример 2. Управление сессионными куками через COOKIEJAR
<?php
$cookieJar = sys_get_temp_dir() . '/curl_cookies_' . uniqid() . '.txt';
$ch = curl_init('https://httpbin.org/cookies/set?session=abc123');
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieJar);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_exec($ch);
curl_close($ch);
$ch2 = curl_init('https://httpbin.org/cookies');
curl_setopt($ch2, CURLOPT_COOKIEFILE, $cookieJar);
curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch2);
echo $response;
unlink($cookieJar);
?>
{
"cookies": {
"session": "abc123"
}
}
Пример 3. Авторизация через HTTP прокси с Basic аутентификацией
<?php
$ch = curl_init('https://api.example.com/data');
curl_setopt($ch, CURLOPT_PROXY, 'http://proxy.company.com:8080');
curl_setopt($ch, CURLOPT_PROXYUSERPWD, 'proxy_user:proxy_pass');
curl_setopt($ch, CURLOPT_PROXYAUTH, CURLAUTH_BASIC);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
if (curl_error($ch)) {
echo 'Ошибка прокси: ' . curl_error($ch);
} else {
echo $response;
}
curl_close($ch);
?>
{"status":"ok","data":"..."}
Пример 4. Загрузка файла с авторизацией Bearer токена
<?php
$file = new CURLFile('/path/to/file.pdf', 'application/pdf', 'document.pdf');
$postData = ['file' => $file];
$ch = curl_init('https://api.example.com/upload');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . $token,
'Content-Type: multipart/form-data'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo "HTTP код: $httpCode\n";
echo "Ответ: $response\n";
?>
HTTP код: 200
Ответ: {"success":true,"file_id":"12345"}
Пример 5. Игнорирование ошибок SSL (только для тестирования)
<?php
$ch = curl_init('https://self-signed.badssl.com/');
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
echo "Запрос выполнен, длина ответа: " . strlen($response) . "\n";
curl_close($ch);
?>
Запрос выполнен, длина ответа: 1532
Пример 6. Параллельные авторизованные запросы через curl_multi
<?php
$token = 'bearer_token';
$urls = ['https://api.example.com/users', 'https://api.example.com/orders'];
$master = curl_multi_init();
$handles = [];
foreach ($urls as $i => $url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HTTPHEADER, ['Authorization: Bearer ' . $token]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_multi_add_handle($master, $ch);
$handles[$i] = $ch;
}
$running = null;
do {
curl_multi_exec($master, $running);
curl_multi_select($master);
} while ($running > 0);
foreach ($handles as $ch) {
$response = curl_multi_getcontent($ch);
echo "Результат: " . substr($response, 0, 100) . "...\n";
curl_multi_remove_handle($master, $ch);
curl_close($ch);
}
curl_multi_close($master);
?>
Результат: [{"id":1,"name":"Alice"},{"id":2,"name":"Bob"}]...
Результат: [{"order_id":101,"amount":250}]...