如何仅修复无效请求(不支持的 SSL 请求)php?

how to fix Invalid request (Unsupported SSL request) only php?

问题的上下文 我正在 www.platzi.com 上一门课程,在这一章中,他们将教我们令牌 Web 身份验证的逻辑和操作。所以下面展示的代码就是课程中展示的那样

代码流程如下:

您有一个名为“server.php”的资源服务器,该服务器负责管理您拥有的资源。 有一个名为“router.php”的路由服务器,这个服务器负责接收请求,交给名为“server.php”的资源服务器 有一个认证服务器叫auth_server.php,这个服务器有两个作用:

  1. 当用户登录时创建一个令牌
  2. 验证用户提供给名为 server.php
  3. 的资源服务器的令牌

代码

代码server.php

<?php

header('Content-Type: application/json');
// validación de que el servidor de recursos  recibió un token
if (!array_key_exists('HTTP_X_TOKEN', $_SERVER)) {

die;
}

// $url = 'https://' . $_SERVER['HTTP_HOST'] . '/auth';

// Se debe validar el token recibido con el servidor,
// de autenticación ejecutando una llamada a tráves
//  de curl.
$url = 'https://localhost:8001';

// iniciamos la llamada de curl
$ch = curl_init($url);

// Se configura curl para enviar
// el token y  validarlo con el serrvidor
// de validación.
curl_setopt(
$ch,
CURLOPT_HTTPHEADER,
[
"X-Token: {$_SERVER['HTTP_X_TOKEN']}",
]
);

// Se configura  curl nuevamente para recibir la
// respuesta sobre el token  que enviamos
// del servidor de validación
curl_setopt(
$ch,
CURLOPT_RETURNTRANSFER,
true
);

// Se obtine la respuesta del servidor
// de validación
$ret = curl_exec($ch);

// finalmente se compara la respuesta del servidor
// de autenticación, si el resultado no es true
// entonces el usuario no ha sido autenticado
// correctamente
if ($ret !== 'true') {
http_response_code(403);

die;
}


$books = [
1 => [
'titulo' => 'Lo que el viento se llevo',
'id_autor' => 2,
'id_genero' => 2,
],
2 => [
'titulo' => 'La Iliada',
'id_autor' => 1,
'id_genero' => 1,
],
3 => [
'titulo' => 'La Odisea',
'id_autor' => 1,
'id_genero' => 1,
],
];

$allowedResourceTypes = [
'books',
'authors',
'genres',
];

$resourceType = $_GET['resource_type'];
if (!in_array($resourceType, $allowedResourceTypes)) {
header('Status-Code: 400');
echo json_encode(
[
  'error' => "Resource type '$resourceType' is un unkown",
]
);

die;
}


$resourceId = array_key_exists('resource_id', $_GET) ? $_GET['resource_id'] : '';
$method = $_SERVER['REQUEST_METHOD'];

switch (strtoupper($method)) {
case 'GET':
if ("books" !== $resourceType) {
  header('Status-Code: 404');

  echo json_encode(
    [
      'error' => $resourceType . ' not yet implemented :(',
    ]
  );

  die;
}

if (!empty($resourceId)) {
  if (array_key_exists($resourceId, $books)) {
    echo json_encode(
      $books[$resourceId]
    );
  } else {
    header('Status-Code: 404');

    echo json_encode(
      [
        'error' => 'Book ' . $resourceId . ' not found :(',
      ]
    );
  }
} else {
  echo json_encode(
    $books
  );
}

die;

break;
case 'POST':
$json = file_get_contents('php://input');

$books[] = json_decode($json);

echo array_keys($books)[count($books) - 1];
break;
case 'PUT':
if (!empty($resourceId) && array_key_exists($resourceId, $books)) {
  $json = file_get_contents('php://input');

  $books[$resourceId] = json_decode($json, true);

  echo $resourceId;
}
break;
case 'DELETE':
if (!empty($resourceId) && array_key_exists($resourceId, $books)) {
  unset($books[$resourceId]);
}
break;
default:
header('Status-Code: 404');

echo json_encode(
  [
    'error' => $method . ' not yet implemented :(',
  ]
);

break;
}

代码router.php


<?php

$matches = [];

if (preg_match('/\/([^\/]+)\/([^\/]+)/', $_SERVER["REQUEST_URI"], $matches)) {
  $_GET['resource_type'] = $matches[1];
  $_GET['resource_id'] = $matches[2];

  error_log(print_r($matches, 1));
  require 'server.php';
} elseif (preg_match('/\/([^\/]+)\/?/', $_SERVER["REQUEST_URI"], $matches)) {
  $_GET['resource_type'] = $matches[1];
  error_log(print_r($matches, 1));

  require 'server.php';
} else {

  error_log('No matches');
  http_response_code(404);
}

验证码_server.php


<?php

$method = strtoupper($_SERVER['REQUEST_METHOD']);

// $token = "5d0937455b6744.68357201";
$token = sha1('Esto es secreto!!');

if ($method === 'POST') {
  if (!array_key_exists('HTTP_X_CLIENT_ID', $_SERVER) || 
      !array_key_exists('HTTP_X_SECRET', $_SERVER)) {
          http_response_code(400);

         die('Faltan parametros');
  }

  $clientId = $_SERVER['HTTP_X_CLIENT_ID'];
  $secret = $_SERVER['HTTP_X_SECRET'];

  if ($clientId !== '1' || $secret !== 'SuperSecreto!') {
    http_response_code(403);

    die("No autorizado");
  }

  echo "$token";
} elseif ($method === 'GET') {
  if (!array_key_exists('HTTP_X_TOKEN', $_SERVER)) {
    http_response_code(400);

    die('Faltan parametros');
  }

  if ($_SERVER['HTTP_X_TOKEN'] == $token) {
    echo 'true';
  } else {
    echo 'false';
  }
} else {
  echo 'false';
}

重现问题的步骤

  1. 他以前提供的代码在一个文件夹中。上面显示的每个代码都分为单独的文件:server.php、router.php、auth_server.php

  2. 在 linux 终端中,为每个服务器和请求打开一个选项卡 即下图所示。在选项卡中,路由器服务器启动

$ php -S localhost:8000 router.php

ini router server

  1. 在另一个选项卡中,身份验证服务器启动
$ php -S localhost:8001 auth_server.php

ini auth server

  1. 在另一个选项卡中,向身份验证服务器发出请求以 请求令牌,服务器创建令牌,我 return 它在 终端。必须复制令牌并与 GET 请求一起发送 这将在下一步中显示。令牌创建
curl http://localhost:8001 -X 'POST' -H 'X-CLIENT-Id:1' -H 'X-Secret:SuperSecreto!'

get token

  1. 在另一个选项卡中,GET 请求与令牌一起发出
curl http://localhost:8000/books -H 'X-Token:c4b02a1525349e7888d4140dcd524aff2d6296dd'

request list book with token

和。最后在上一个查询之后什么也没有显示。

预期行为: 显示书籍列表。 当前行为: 它不显示书籍列表,并且在身份验证服务器 运行 的选项卡中显示消息:

[Wed Jun 2 12:42:21 2021] :: 1: 48248 Invalid request (Unsupported SSL request)

error in auth server

环境规范 linux ubuntu 20.04

版本php PHP7.1.33-37

注意:抱歉我的英语不好。我正在使用翻译器

// Se debe validar el token recibido con el servidor,
// de autenticación ejecutando una llamada a tráves
//  de curl.
$url = 'https://localhost:8001';

需要

// Se debe validar el token recibido con el servidor,
// de autenticación ejecutando una llamada a tráves
//  de curl.
$url = 'http://localhost:8001';