PHP、JWT 透传路径和方法

Posted

技术标签:

【中文标题】PHP、JWT 透传路径和方法【英文标题】:PHP, JWT passthrough path and method 【发布时间】:2018-03-11 00:09:13 【问题描述】:

我正在通过 slim 框架构建一个应用程序,它是 slim-jwt-auth 中间件。

我安装了它,它工作正常,但我对传递的可能性有点困惑。

我的请求路径规则:

new \Slim\Middleware\JwtAuthentication\RequestPathRule([
            "path" => ["/api"],
            "passthrough" => ["/api/auth", "/api/users", "/api/products", "/api/orders", "/api/streets",
                              "/api/reservations", "/api/feedbacks", "api/menu"]
        ])

还有我的 RequestMethodRule:

new \Slim\Middleware\JwtAuthentication\RequestMethodRule([
            "passthrough" => ["POST", "GET"]
        ])

但它允许所有端点使用这些方法。实际上,我只想让 POST 到 /api/auth/api/orders/api/reservations/api/feedbacks,并为除 /api/users 之外的每个端点提供 GET。

这怎么可能?

提前谢谢你。

【问题讨论】:

【参考方案1】:

看看你的路线会很有趣,但基本上在你当前的配置中你说的是:

1) 不要验证“/api/auth”、“/api/users”、“/api/products”、“/api/orders”、“/api/streets”、“/api/reservations” 、“/api/feedbacks”和“api/menu”(/api 下的其余端点必须经过身份验证)

2) 并且也不验证任何 POST 或 GET 请求

一些例子:

PUT /api/users 永远不会进行身份验证,因为 /api/users 在 请求路径规则 GET /api/users 永远不会进行身份验证,因为 /api/users 在 RequestPathRule AND GET 在 RequestMehtodRule 中 PUT /api/whatever 总是会进行身份验证,因为 /api/users 是 不在 RequestPathRule AND GET 不在 RequestMethodRule 中

基本上,规则的工作方式类似于 OR 比较运算符,并且在适当的时候,端点位于 RequestPathRule 中或请求方法位于 RequestMethodRule 中,请求将不会被验证。

更好的方法是尽量不使用 RequestMethodRule(通常只包含 OPTIONS 方法)并使用不同的路径。

在普通的 Web 应用程序中,您将在 /api 下为您的客户端提供公共 API 路径,并且您通常不进行身份验证的唯一端点是 /api/login(或在您的示例中为 /api/auth)端点的其余部分在/api 下进行身份验证。如果您提供另一组您不想进行身份验证的端点,则您提供另一个不同的路径,例如/service,并且您不要将其作为“路径”包含在 RequestPathRule 中。如果您需要一组经过 ALL 身份验证的端点,您可以在新路径下创建所有端点,例如 /admin 并且您在 RequestPathRule 中包含路径,并且您没有为它们添加任何“直通”。

所以想法是使用不同的路径,只需在 RequestMethodRule 下为特定用例添加这些方法。此外,通过这种方式,您将拥有更清晰、更有条理的 API。

查看您的端点,我建议您为大多数端点创建不同的路径,因此不要使用“/api/auth”、“/api/users”、“/api/products”、“/api/orders”建议您使用“/auth”、“/user”、“/product”、“/order”...您可以为每个路径添加RequestPathRuleRequestMethodRule

老实说,考虑到 slim-jwt-auth 中间件,很难在同一个端点上提供 CRUD 操作,假设您在 /user 上有 GET、POST、PUT 和 DELETE,而您只想验证 POST,放置和删除。对于这种情况,您可以有 2 个选项:

    为每个动词创建不同的端点,例如:GET /user/allPOST /user/addPUT /user/editDELETE /user/delete(这是一种不好的做法 创建或扩展您的 RequestPathRuleRequestMethodRule 可调用对象,其唯一条件是它们必须实现 RuleInterface 并根据您的需求调整它们(强烈推荐)

如果您选择第二个选项,您只需将那些可调用的添加到 rules 选项。像这样的:

$app->add(new \Slim\Middleware\JwtAuthentication([
"rules" => [
    new \My\Auth\Rules\RequestPathRule([
        "path" => "/",
        "passthrough" => []
    ]),
    new \My\Auth\Rules\RequestMethodRule([
        "passthrough" => ["OPTIONS"]
    ])
]
]));

【讨论】:

同意。 #2 是最好的解决方案。

以上是关于PHP、JWT 透传路径和方法的主要内容,如果未能解决你的问题,请参考以下文章

express-jwt 不尊重不受保护的路径

JWT 身份验证回退到相同路径的 SAML2

php获取上级文件绝对路径

php中的路径问题

如何在 hapi.js 上的路径上使用 hapi-auth-jwt2 身份验证?

怎样隐藏一部分php文件路径