Извлечение пользовательского заголовка авторизации из входящего PHP-запроса

Поэтому я пытаюсь проанализировать входящий запрос в PHP, который имеет следующий набор заголовков:

Authorization: Custom Username

Простой вопрос: как, черт возьми, я в него попаду? Если бы это было Authorization: BasicЯ мог бы получить имя пользователя от $_SERVER["PHP_AUTH_USER"], Если бы это было X-Custom-Authorization: UsernameЯ мог бы получить имя пользователя от $_SERVER["HTTP_X_CUSTOM_AUTHORIZATION"], Но ни один из них не установлен пользовательской авторизацией, var_dump($_SERVER) не показывает упоминания заголовка (в частности, AUTH_TYPE отсутствует), и PHP5 функции, такие как get_headers() работать только на ответы на исходящие запросы. Я использую PHP 5 на Apache с готовой установкой Ubuntu.

6 ответов

Решение

Если вы собираетесь использовать только Apache, вы можете посмотреть на apache_request_headers(),

Для аутентификации на основе токена:

  $token = null;
  $headers = apache_request_headers();
  if(isset($headers['Authorization'])){
    $matches = array();
    preg_match('/Token token="(.*)"/', $headers['Authorization'], $matches);
    if(isset($matches[1])){
      $token = $matches[1];
    }
  } 

Добавьте этот код в свой .htaccess

RewriteEngine On
RewriteRule .* - [e=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

Передайте свой заголовок как Authorization: {auth_code} и, наконец, вы получите код авторизации с помощью $_SERVER['HTTP_AUTHORIZATION']

Juste использовать:

$headers = apache_request_headers();
$token = $headers['token'];

Для справки, почему Apache отфильтровывает Authorization заголовок: /questions/3247980/apache-24-php-fpm-i-zagolovki-avtorizatsii/3248004#3248004

Решения в зависимости от того, какой модуль Apache используется для передачи запроса в приложение:

mod_wsgi, mod_fcgid:

CGI:

Другие хаки - массируя заголовки в этом вопросе:

      otra solución php, esta esta disponible para todos los servidores a cambio apache_request_headers() solo aplica para apache...... 
$headers = getallheaders();
$token = null;

if (isset($headers['Authorization'])) {
    $authorizationHeader = $headers['Authorization'];
    $matches = array();
    if (preg_match('/Bearer (.+)/', $authorizationHeader, $matches)) {
        if (isset($matches[1])) {
            $token = $matches[1];
        }
    }
}

if ($token) {
    // El token está presente en la cabecera de autorización
    echo json_encode("Token recibido: " . $token);
} else {
    // El token no está presente en la cabecera de autorización
    echo json_encode("Error: Token no presente en la cabecera de autorización");
}
Другие вопросы по тегам