php - 如何仅修复 php 的无效请求(不支持的 SSL 请求)?
问题描述
问题的背景 我在www.platzi.com上一门课程,在本章中,他们正在教我们令牌 Web 身份验证的逻辑和操作。所以下面显示的代码如课程中所示。
代码流程如下:
您有一个名为“server.php”的资源服务器,该服务器负责您拥有的资源。有一个路由服务器叫“router.php”,这个服务器负责接收请求,交给资源服务器叫“server.php” 有一个用于认证的服务器叫auth_server.php,这个服务器有两个功能:
- 用户登录时创建令牌
- 验证用户提供给名为 server.php 的资源服务器的令牌
代码
代码服务器.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);
}
代码 auth_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';
}
复制问题的步骤
他之前提供的代码在一个文件夹中。上面显示的每个代码都被分成单独的文件:server.php、router.php、auth_server.php
在 linux 终端中,为每个服务器和请求打开一个选项卡,如下所示。在选项卡中,路由器服务器启动
$ php -S localhost:8000 router.php
- 在另一个选项卡中,身份验证服务器启动
$ php -S localhost:8001 auth_server.php
- 在另一个选项卡中,向身份验证服务器发出请求以请求令牌,服务器创建令牌并在终端中返回它。必须复制令牌并将其与下一步中显示的 GET 请求一起发送。令牌创建
curl http://localhost:8001 -X 'POST' -H 'X-CLIENT-Id:1' -H 'X-Secret:SuperSecreto!'
- 在另一个选项卡中,GET 请求与令牌一起发出
curl http://localhost:8000/books -H 'X-Token:c4b02a1525349e7888d4140dcd524aff2d6296dd'
和。最后在上一个查询之后没有显示任何内容。
预期行为: 显示书籍列表。 当前行为: 它不显示书籍列表,并且在运行身份验证服务器的选项卡中显示以下消息:
[Wed Jun 2 12:42:21 2021] :: 1: 48248 Invalid request (Unsupported SSL request)
环境规范 linux ubuntu 20.04
版本 php PHP 7.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';
推荐阅读
- arrays - 接收条件推送数组的重复结果
- ruby-on-rails - 我收到一个错误 `to_s': wrong number of arguments (given 1, expected 0) and how can imrpove my "code"?
- python - 用于在 whatsapp 上向某人发送音频的 Python 脚本
- c# - 文本文件包含记录之间的回车
- react-native - 进程以非零代码退出:1 在创建 React Native App 期间使用 expo init 时出现子进程错误
- javascript - 从对象中删除元素 - javascript
- typescript - tsconfig 和环境声明中的项目引用
- python - 如何替换 YAML 文件中的多个相同值
- database - API 平台 - 针对大型数据库处理分页
- c# - NEST 中的模拟 Elasticsearch 客户端存在异步搜索方法问题