Php header authorization получить

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

5 ответов

Если вы собираетесь использовать только 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:%] 

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

Источник

How to get Authorization header in PHP

In order to construct a secure resource that can be accessed through an API, we must utilize an authorization header with a token or bearer. In this article, I will guide you how to obtain the authorization header, extract the token or bearer. Then authenticate it against a database table and return a JSON output in PHP.

Here is what I have on my system.

PHP already has a built-in function, getallheaders(), that can retrieve all headers. It is useful because it eliminates the need for additional code to be written.

The next step is to check if the key exists in the array. We will use the array_key_exists function. If it does not exist, return an error.

if (!array_key_exists('Authorization', $headers)) < echo json_encode(["error" =>"Authorization header is missing"]); exit; >

In most cases, the token has a keyword of your choice, such as ‘Token‘ or ‘Bearer‘. To check this, we will use the substr function.

if (substr($headers['Authorization'], 0, 6) !== 'Token ') < echo json_encode(["error" =>"Token keyword is missing"]); exit; >
if (substr($headers['Authorization'], 0, 7) !== 'Bearer ') < echo json_encode(["error" =>"Bearer keyword is missing"]); exit; >

Now we will extract the actual token. This is for Token keyword.

$token = trim(substr($headers['Authorization'], 6));

We will also need to check the validity of the token against a database table. I am using my own framework for this purpose, but you can also accomplish this by connecting to the database and running a query similar to the following:

$host = "host"; $dbname = "database"; $username = "username"; $password = "password"; $conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $query = "SELECT COUNT(t.token) as totalRows FROM tokens as t WHERE t.token = :token"; $data = [ "token" => $token ]; $stmt = $conn->prepare($query); $stmt->execute($data); $result = $stmt->fetch(PDO::FETCH_ASSOC); $count = $result['totalRows'];
$host = "host"; $dbname = "database"; $username = "username"; $password = "password"; $conn = new PDO("mysql:host=$host;dbname=$dbname", $username, $password); $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $headers = getallheaders(); if (!array_key_exists('Authorization', $headers)) < echo json_encode(["error" =>"Authorization header is missing"]); exit; > else < if (substr($headers['Authorization'], 0, 6) !== 'Token ') < echo json_encode(["error" =>"Token keyword is missing"]); exit; > else < $token = trim(substr($headers['Authorization'], 6)); $query = "SELECT COUNT(t.token) as totalRows FROM tokens as t WHERE t.token = :token"; $data = [ "token" =>$token ]; $stmt = $conn->prepare($query); $stmt->execute($data); $result = $stmt->fetch(PDO::FETCH_ASSOC); $count = $result['totalRows']; if ($count == 0) < echo json_encode(["error" =>"Authorization failed"]); exit; > else < ## continue the rest of your stuff >> >

If you are using Bearer keyword, remember to change the position to 7 in substr function.

Something like this will work.

$token = trim(substr($headers['Authorization'], 7));

Источник

getallheaders

Эта функция является псевдонимом функции apache_request_headers() . Пожалуйста, обратитесь к описанию функции apache_request_headers() для получения детальной информации о её работе.

Список параметров

У этой функции нет параметров.

Возвращаемые значения

Ассоциативный массив, содержащий все HTTP-заголовки для данного запроса или false в случае возникновения ошибок.

Список изменений

Версия Описание
7.3.0 Эта функция стала доступна в SAPI FPM.

Примеры

Пример #1 Пример использования getallheaders()

foreach ( getallheaders () as $name => $value ) echo » $name : $value \n» ;
>

Смотрите также

User Contributed Notes 9 notes

it could be useful if you using nginx instead of apache

if (! function_exists ( ‘getallheaders’ ))
<
function getallheaders ()
<
$headers = [];
foreach ( $_SERVER as $name => $value )
<
if ( substr ( $name , 0 , 5 ) == ‘HTTP_’ )
<
$headers [ str_replace ( ‘ ‘ , ‘-‘ , ucwords ( strtolower ( str_replace ( ‘_’ , ‘ ‘ , substr ( $name , 5 )))))] = $value ;
>
>
return $headers ;
>
>
?>

A simple approach to dealing with case insenstive headers (as per RFC2616) is via the built in array_change_key_case() function:

$headers = array_change_key_case(getallheaders(), CASE_LOWER);

There’s a polyfill for this that can be downloaded or installed via composer:

Beware that RFC2616 (HTTP/1.1) defines header fields as case-insensitive entities. Therefore, array keys of getallheaders() should be converted first to lower- or uppercase and processed such.

dont forget to add the content_type and content_lenght if your are uploading file:

function emu_getallheaders () <
foreach ( $_SERVER as $name => $value )
<
if ( substr ( $name , 0 , 5 ) == ‘HTTP_’ )
<
$name = str_replace ( ‘ ‘ , ‘-‘ , ucwords ( strtolower ( str_replace ( ‘_’ , ‘ ‘ , substr ( $name , 5 )))));
$headers [ $name ] = $value ;
> else if ( $name == «CONTENT_TYPE» ) <
$headers [ «Content-Type» ] = $value ;
> else if ( $name == «CONTENT_LENGTH» ) <
$headers [ «Content-Length» ] = $value ;
>
>
return $headers ;
>
?>

chears magno c. heck

apache_request_headers replicement for nginx

if (! function_exists ( ‘apache_request_headers’ )) <
function apache_request_headers () <
foreach( $_SERVER as $key => $value ) <
if ( substr ( $key , 0 , 5 )== «HTTP_» ) <
$key = str_replace ( » » , «-» , ucwords ( strtolower ( str_replace ( «_» , » » , substr ( $key , 5 )))));
$out [ $key ]= $value ;
>else <
$out [ $key ]= $value ;
>
>
return $out ;
>
>
?>

warning, at least on php-fpm 8.2.1 and nginx, getallheaders() will return «Content-Length» and «Content-Type» both containing emptystring, even for requests without any of these 2 headers. you can do something like

retrieve token from header:

function getAuthorizationHeader () $headers = null ;
if (isset( $_SERVER [ ‘Authorization’ ])) $headers = trim ( $_SERVER [ «Authorization» ]);
>
elseif (isset( $_SERVER [ ‘HTTP_AUTHORIZATION’ ])) $headers = trim ( $_SERVER [ «HTTP_AUTHORIZATION» ]);
>
elseif ( function_exists ( ‘apache_request_headers’ )) $requestHeaders = apache_request_headers ();
$requestHeaders = array_combine ( array_map ( ‘ucwords’ , array_keys ( $requestHeaders )), array_values ( $requestHeaders ));

if (isset( $requestHeaders [ ‘Authorization’ ])) $headers = trim ( $requestHeaders [ ‘Authorization’ ]);
>
>

function getBearerToken () $headers = getAuthorizationHeader ();

if (!empty( $headers )) if ( preg_match ( ‘/Bearer\s(\S+)/’ , $headers , $matches )) return $matches [ 1 ];
>
>

Due to the else part.
>else <
$out[$key]=$value;
All server Variables are added to the headers list, and that’s not the desired outcome.

Оцените статью