从传入的PHP请求中获取自定义授权头

51

所以我正在尝试在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())仅适用于对外发出的请求的响应。我在一个默认Ubuntu安装上运行PHP 5 Apache。
6个回答

69

对于基于令牌的认证:

  $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];
    }
  } 

57

8
@halfdan:否则呢?我正在使用nginx,但无法在标头中获取授权。 - Divakarcool
此页面提供了有关不同服务器类型以及如何使用授权的完整详细信息,请务必阅读页面上的评论。 - Jagadish Meghval
检查 PHP 变量 $_SERVER 数组,以防您的网站被重定向 -> REDIRECT_AUTHORIZATION。 - 9swampy

43
将此代码添加到您的.htaccess文件中。
RewriteEngine On
RewriteRule .* - [e=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

像这样传递您的标头:Authorization: {auth_code},最终您可以通过使用$_SERVER['HTTP_AUTHORIZATION']来获取授权码。

注意:上述方法适用于Apache,如果您使用的是Nginx,则无需更新任何内容。您可以像这样轻松地在Nginx中获取值:

如果您传递了authorization键,只需在$_SERVER前缀中添加HTTP_,就可以通过放置$_SERVER['HTTP_AUTHORIZATION']来获取键值或其他任何内容。

postman_token => HTTP_POSTMAN_TOKEN
test_key => HTTP_TEST_KEY

22

只需使用:

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

12

0
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");
}

请注意,这是 Stack Overflow 的仅英文版本。还有其他多个版本,比如 .es、.pt 等等。 - ahuemmer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接