我使用基于JWT令牌的身份验证来验证我向移动应用程序公开的RESTAPI。我有一个登录API,用户将点击并获得一个JWT作为响应。应用程序必须对其余请求使用JWT令牌。在开发过程中出现的一个问题是。
一旦我给用户一个身份验证令牌,他就可以访问这组API的其余部分。
在我的当前设计中,带有JWT令牌的用户1试图访问用户2的资源是可能的,这是我的系统中的一个缺陷。在每次请求时,我是否必须检查令牌中的用户id和请求进程的用户id是否匹配,然后继续?或者还有其他更好的方式来处理这个问题吗?
我使用的是带有dingo-rest和JWT-lib的laravel框架。
更新
例如:
作为个人,我从应用程序中获得了端点。我登录并收到了我的jwt令牌,它将在我的其他资源中有效。现在,为了获得我使用不同用户id添加的产品列表,我可以这样做
标题中的我的JWT令牌
GET /products/3 and 3 is not my user id!
在这种情况下,我只是验证一个jwt令牌,它将验证它并使用非MINE的资源进行响应!
TL;DR:以这种方式使用它是很常见的,你应该做好它!
更多详细信息:这里的重点是,令牌"足够模糊",因此未经授权的用户从授权用户处获得令牌的可能性微乎其微。在您的示例中,这意味着用户2可以非常高的概率不猜测用户1正在使用的令牌。
当然,这种方式可能是中间人攻击,所以你应该确保只通过安全连接传输令牌。我建议"仅HTTPS"。此外,您可能只考虑在标头中发送和接收令牌,这样它们就不会在任何内容视图中公开。
作为更多的背景:想想PHP"标准"会话cookie是如何工作的:用户(客户端)在cookie中获取会话ID并将其发送回。这与您在JWT中所做的基本相同,因为用户2也可能以某种方式从用户1那里窃取cookie,并代表他行事。JWT甚至为您添加了一个级别,您可以很容易地确认您确实发布了令牌(前提是您使用的是RSA密钥对风格的方法),我认为这比PHP会话ID cookie方法有优势。