Извлечение пользовательского заголовка авторизации из входящего 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");
}