Методы HTTP авторизации с использованием PHP cURL

Раздел: PHP -> HTTP запросы с 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 exec php (php curl exec)
- Curl setopt php (php curl setopt)
- Php curl file (php curl файл)

Расширенные примеры авторизации через 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}]...

PHP cURL авторизация - comments

En
Php curl authorization (php)