【问题标题】:Add required parameter values for perform GET and POST request in PHP在 PHP 中添加执行 GET 和 POST 请求所需的参数值
【发布时间】:2017-06-05 17:30:18
【问题描述】:

我正在尝试弄清楚如何使我的实际 Slim php 应用程序更有用和更复杂(是的,我正在尝试执行类似于非常简单的 APIrest 服务的操作),其中我执行了一些不同类型的请求,有些是 GET 请求,有些是 POST 请求:

获取所有书籍对象的GET请求

$app->get('/api/books', function () { 
require_once('db/connector_test.php');

    $statement = $pdo->prepare("SELECT * FROM books ORDER BY id");
    $statement->execute();
    $data = $statement->fetchAll(PDO::FETCH_OBJ);

    if (isset($data)) {
       echo "<pre>";
       header('Content-Type: application/json');
       print json_encode($data);
       echo "</pre>";
       }
});

在这种情况下,我已经完成了另一个 GET 请求,以在 GET 请求中的特定 '/api/books/{id}'url 之后检索特定书籍对象数据,这是非常简单的结果:

用于插入新记录的 POST 请求

$app->post('/api/books', function ($request) {
    require_once('db/connector_test.php');

    $statement = $pdo->prepare("INSERT INTO `books` (`title`, `author`, `amazon_url`) VALUES (:stitle,:sauthor,:samazon_url)");
    //$statement->bindParam(':title',':author',':amazon_url', $title, $author, $amazon_url);

    $statement->execute(array(
    "stitle" => $request->getParsedBody()['title'],
    "sauthor" => $request->getParsedBody()['author'],
    "samazon_url" => $request->getParsedBody()['amazon_url']
    ));

在这种情况下,我刚刚使用Postman client 对其进行了测试,方法是将三个参数(标题、作者、amazon_url)作为正文参数添加到执行 POST 请求的数据库中。

我现在需要做什么? (这就是这个问题的重点)

我已经考虑过可以使这些 HTTP 请求更安全的方法,可能是通过在每个请求中添加一些必需的参数,以便更好地控制这些资源的使用.. .like authkey 或一些强制性的特定参数。因此,想要对这些资源发出 GET 和 POST 请求的普通用户需要知道需要哪种参数值。

有人可以建议我如何在 Slim 和 PHP 中包含这个逻辑?因为我认为如果我在 PHP 中理解了这个概念,我也可以很容易地理解 Slim 框架。

【问题讨论】:

  • 在 slim 中搜索中间件
  • 我已经看过了,但我想我没有抓住重点......

标签: php post get slim


【解决方案1】:

所以您想对您的 API 进行某种身份验证 这可以使用 slim Middleware in Slim 中的中间件来完成@

您可以在其中围绕整个 API 或仅特定路线构建访问门 在这个中间件中,您可以使用此检查类似 JWT 令牌的令牌 Slim-JWT

您还可以检查用户的一些参数值

编辑添加示例

首先你需要创建一个路由来生成 JWT Token like

$app->get('/JWTToken',function($req,$res){
$MyJWT=$this->JWT;
    $now = new DateTime();
    $future = new DateTime("now +10 minutes");
   // $server = $request->getServerParams();
    $payload = [
        "iat" => $now->getTimeStamp(),
        "exp" => $future->getTimeStamp(),
        "sub" =>"test for JWT",
    ];
    $secret = "supersecretkeyyoushouldnotcommittogithub";
    $token = $MyJWT->encode($payload, $secret, "HS512");
    $data["status"] = "ok";
    $data["token"] = $token;
    return $res->withStatus(201)
        ->withHeader("Content-Type", "application/json")
        ->write(json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));
});

此路由会生成一个有效期仅为 10 分钟的 JWT 令牌

第二次添加中间件检查Token验证

$app->add(new \Slim\Middleware\JwtAuthentication([
     "path" => ["/"],
    "passthrough" => ["/JWTToken"],
    "secret" => "supersecretkeyyoushouldnotcommittogithub",
    "error" => function ($request, $response, $arguments) {
        $data["status"] = "error";
        $data["message"] = $arguments["message"];
        return $response
            ->withHeader("Content-Type", "application/json")
            ->write(json_encode($data, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT));
    }
]));

此中间件将检查令牌是否有效 如果 true 将调用您的 GET 或 POST 路由,否则将发送未经授权的错误

您需要根据这些要求更新您的 Composer

"firebase/php-jwt": "^4.0",
"tuupola/slim-jwt-auth": "^2.3"

编辑#2 要发送任何请求,您需要发送此标头

Authorization: Bearer  "Token String" 

邮递员的例子

【讨论】:

  • 你能给我看一个非常简单的例子,说明我如何根据我的实际代码来处理这个访问门吗?也许需要一个简单的 authkey 参数来执行我上面显示的 GET 和 POST 请求。
  • 对于“路径”,您的意思是例如为检索某些资源设置的路径,例如/api/books?现在您已经设置了“/”路径,所以如果我理解得很好,这个令牌验证会影响已经声明的每个资源路径?
  • 是的,没错,此验证会影响您的所有路线
  • 那么,例如对于 GET 方法,考虑到我们需要传递令牌以完成身份验证,请求将如何?
  • 您将发送带有 JWT 令牌数据的授权标头,
猜你喜欢
  • 1970-01-01
  • 2014-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 2017-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多