在PHP

时间:2017-06-05 17:30:18

标签: php post get slim

我试图找出如何使我的实际Slim php应用程序更有用和更复杂(是的,我尝试执行类似于非常简单的API的服务)执行了一些不同类型的请求,一些是GET请求,一些是POST请求:

获取检索所有图书对象的请求

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

the result data of GET request

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

enter image description here

插入新记录的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测试它,通过添加三个参数(title,author,amazon_url)作为Body Parameter,并在执行POST请求的数据库中添加我想要添加的值。

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

我已经考虑过可以使这些HTTP请求更安全的东西,可能通过在每个请求中添加一些必需的参数来为这些资源的使用添加更好的控制。 。比如 authkey 或一些强制性的特定参数。因此,想要对这些资源进行GET和POST请求的普通用户需要知道需要哪种参数值。

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

1 个答案:

答案 0 :(得分:1)

因此,您希望对API进行某种身份验证 这可以使用苗条Middleware in Slim

中的中间件来完成

您可以在整个API或特定路径周围构建访问门 在这个middeleware中,您可以使用此方法检查令牌,如JWT令牌 Slim-JWT

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

编辑以添加示例

首先,你需要创建一个生成JWT令牌的路由,如

$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令牌

第二次添加中间件以检查令牌验证

$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" 

邮递员的例子 enter image description here