如何仅修复无效请求(不支持的 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,这个服务器有两个作用:
- 当用户登录时创建一个令牌
- 验证用户提供给名为 server.php
的资源服务器的令牌
代码
代码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';
}
重现问题的步骤
他以前提供的代码在一个文件夹中。上面显示的每个代码都分为单独的文件:server.php、router.php、auth_server.php
在 linux 终端中,为每个服务器和请求打开一个选项卡
即下图所示。在选项卡中,路由器服务器启动
$ php -S localhost:8000 router.php
ini router server
- 在另一个选项卡中,身份验证服务器启动
$ php -S localhost:8001 auth_server.php
ini auth server
- 在另一个选项卡中,向身份验证服务器发出请求以
请求令牌,服务器创建令牌,我 return 它在
终端。必须复制令牌并与 GET 请求一起发送
这将在下一步中显示。令牌创建
curl http://localhost:8001 -X 'POST' -H 'X-CLIENT-Id:1' -H 'X-Secret:SuperSecreto!'
get token
- 在另一个选项卡中,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';
问题的上下文 我正在 www.platzi.com 上一门课程,在这一章中,他们将教我们令牌 Web 身份验证的逻辑和操作。所以下面展示的代码就是课程中展示的那样
代码流程如下:
您有一个名为“server.php”的资源服务器,该服务器负责管理您拥有的资源。 有一个名为“router.php”的路由服务器,这个服务器负责接收请求,交给名为“server.php”的资源服务器 有一个认证服务器叫auth_server.php,这个服务器有两个作用:
- 当用户登录时创建一个令牌
- 验证用户提供给名为 server.php 的资源服务器的令牌
代码
代码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';
}
重现问题的步骤
他以前提供的代码在一个文件夹中。上面显示的每个代码都分为单独的文件:server.php、router.php、auth_server.php
在 linux 终端中,为每个服务器和请求打开一个选项卡 即下图所示。在选项卡中,路由器服务器启动
$ php -S localhost:8000 router.php
ini router server
- 在另一个选项卡中,身份验证服务器启动
$ php -S localhost:8001 auth_server.php
ini auth server
- 在另一个选项卡中,向身份验证服务器发出请求以 请求令牌,服务器创建令牌,我 return 它在 终端。必须复制令牌并与 GET 请求一起发送 这将在下一步中显示。令牌创建
curl http://localhost:8001 -X 'POST' -H 'X-CLIENT-Id:1' -H 'X-Secret:SuperSecreto!'
get token
- 在另一个选项卡中,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';