服务器在身份验证期间向客户端提供JWT。 JWT包含稍后由服务器使用的信息。例如,JWT可能包含permissions
数组,其中包含授予特定用户的所有权限的列表。
如果客户端解析JWT并使用其中包含的权限信息,那么这被认为是不好的做法吗?客户端是否更好地对服务器(例如GET /permissions
)进行额外调用并根据该响应进行操作?
答案 0 :(得分:3)
这很大程度上取决于很多小细节;我会尽量不忘记任何事情,但理论上这样做应该没问题,如果满足某些条件我就不会认为这是一种不好的做法。
OAuth2声明访问令牌对客户端应该是不透明的,但JWT只是一种令牌格式(Learn JSON Web Tokens),在其他情况下它的使用并不意味着与OAuth2相同的规则。
另请注意,从其他请求获取信息具有相同的最终结果,另外还有一次调用的额外开销。如果权限非常不稳定,那么会有一些好处,因为您可以重复调用。
然而,重要的部分更侧重于客户的意思以及客户如何使用该信息,以便我详细说明。
在这种情况下,服务器发出的令牌只是客户端以后访问受保护资源的一种方式,而无需再次进行显式用户身份验证;它是维护两个组件之间会话的一种机制。
鉴于同一实体控制客户端和服务器,将接收的令牌视为白盒而不是黑盒是可以接受的。然后,客户端可以解释令牌中的信息并利用它为最终用户提供更好的体验。但是,这意味着服务器需要继续验证令牌及其相应的权限;客户对数据的任何解释纯粹是为了提供可选功能。
此外,对于部署到恶意环境的客户端,例如SPA应用程序的情况,通过查看数据所做的决定必须只能产生纯粹的美学决策,因为用户可能伪造权限数据。例如,您可以使用它来有条件地隐藏/禁用某些用户界面,这样用户就不必单击它以查明它是不允许这样做的。
一个很好的比喻是基于Javascript的网络表单输入验证;你应该这样做以获得更好的用户体验,但服务器需要再次这样做,因为用户可以绕过Javascript验证。