【问题标题】:Rest API JWT token based authentication security | laravel/dingo/jwtRest API 基于 JWT 令牌的身份验证安全性 | laravel/野狗/jwt
【发布时间】:2025-12-22 22:30:11
【问题描述】:

我正在使用基于 JWT 令牌的身份验证来验证我向移动应用程序公开的 REST API。我有一个登录 API,用户将在其中访问并获取 JWT 作为响应。应用程序必须对其余请求使用 JWT 令牌。在开发过程中遇到的一个问题是。

一旦我给用户一个身份验证令牌,他就可以访问其余的 API。

使用 JWT 令牌 T1 的用户 1 尝试访问用户 2 的资源在我当前的设计中是可能的,这是我系统中的一个缺陷.在每个请求上,我是否必须检查令牌中的用户 ID 和请求进程的用户 ID 是否匹配,然后继续?或者有没有更好的方法来处理这个问题?

我正在使用带有 dingo rest 和 JWT lib 的 laravel 框架。

更新

例如:

作为个人,我从应用程序中获得了端点。我登录并收到了我的 jwt 令牌,该令牌将在我的其余资源中有效。现在要获取我使用不同用户 ID 添加的产品列表。我可以这样做

标头中的我的 JWT 令牌

GET /products/3  and 3 is not my user id!

在这种情况下,我只是验证一个 jwt 令牌,它将验证它并以不是 MINE 的资源响应!

【问题讨论】:

标签: php json rest laravel authentication


【解决方案1】:

TL;DR:恕我直言,以这种方式使用它是很常见的,你应该就这样吧!

更多详情: 这里的要点是令牌“足够模糊”,因此非授权用户从授权用户那里获取令牌的可能性可以忽略不计。在您的示例中,这意味着用户 2 很有可能猜不到用户 1 正在使用的令牌。

当然,这种方式可能会减少中间人攻击,因此您应该确保只通过安全连接传输令牌。我建议“仅 HTTPS”。此外,您可能会考虑仅在标头中发送和接收令牌,因此它们不会暴露在任何内容视图中。

更多背景知识:想想PHP "standard" session cookies 是如何工作的:用户(客户端)在 cookie 中获取会话 ID 并将其发回。这与您在此处使用 JWT 所做的基本相同,因为用户 2 也可以在此处以某种方式从用户 1 那里窃取 cookie,并代表他采取行动。 JWT 甚至为您添加了一个级别,您可以通过该级别轻松确认您确实发布了令牌(前提是您使用的是RSA-keypair-style 方法),我认为这比 PHP 会话 ID cookie 方法更有优势。

【讨论】:

  • 据我了解您更新的问题,您不会为用户进行任何ACL 检查,对吧?我建议将用户 ID 存储在令牌中(并使用用户 ID 进行 ACL 检查!) - 如果 ID 不同,如果您自己没有颁发令牌,则签名必须不同,因此签名将不匹配。如果这是你的意思,请告诉我,我很乐意更新我的答案:)
  • 我如何在 laravel 上做到这一点。你能举一些实际的例子吗?
  • 我不太想在这里复制 laravel 文档。正如在对您的问题的评论中指出的那样,您可以使用 laravel Gate/Auth 系统执行此操作。访问权限在这里被称为“能力”,您可以在the documentation (checking abilities) 中找到大量示例。