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”...您可以为每个路径添加RequestPathRule
和RequestMethodRule
。
老实说,考虑到 slim-jwt-auth 中间件,很难在同一个端点上提供 CRUD 操作,假设您在 /user
上有 GET、POST、PUT 和 DELETE,而您只想验证 POST,放置和删除。对于这种情况,您可以有 2 个选项:
-
为每个动词创建不同的端点,例如:
GET /user/all
、POST /user/add
、PUT /user/edit
和 DELETE /user/delete
(这是一种不好的做法
创建或扩展您的 RequestPathRule
和 RequestMethodRule
可调用对象,其唯一条件是它们必须实现 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 透传路径和方法的主要内容,如果未能解决你的问题,请参考以下文章