我应该在客户端使用身份验证JWT中包含的数据吗?

时间:2016-11-25 11:26:51

标签: authentication client jwt

服务器在身份验证期间向客户端提供JWT。 JWT包含稍后由服务器使用的信息。例如,JWT可能包含permissions数组,其中包含授予特定用户的所有权限的列表。

如果客户端解析JWT并使用其中包含的权限信息,那么这被认为是不好的做法吗?客户端是否更好地对服务器(例如GET /permissions)进行额外调用并根据该响应进行操作?

1 个答案:

答案 0 :(得分:3)

这很大程度上取决于很多小细节;我会尽量不忘记任何事情,但理论上这样做应该没问题,如果满足某些条件我就不会认为这是一种不好的做法

OAuth2声明访问令牌对客户端应该是不透明的,但JWT只是一种令牌格式(Learn JSON Web Tokens),在其他情况下它的使用并不意味着与OAuth2相同的规则。

另请注意,从其他请求获取信息具有相同的最终结果,另外还有一次调用的额外开销。如果权限非常不稳定,那么会有一些好处,因为您可以重复调用。

然而,重要的部分更侧重于客户的意思以及客户如何使用该信息,以便我详细说明。

假设:

  1. 您提到的客户端可以部署为基于浏览器的应用程序(SPA' s),本机应用程序或作为客户端的某些服务器端组件。
  2. 服务器和客户端均由同一实体控制。
  3. 客户端和服务器组件可以看作是单个应用程序,也就是说,对于最终用户而言,客户端和服务器组件没有区别;他们将它们作为一个整体使用。
  4. 解释

    在这种情况下,服务器发出的令牌只是客户端以后访问受保护资源的一种方式,而无需再次进行显式用户身份验证;它是维护两个组件之间会话的一种机制。

    鉴于同一实体控制客户端和服务器,将接收的令牌视为白盒而不是黑盒是可以接受的。然后,客户端可以解释令牌中的信息并利用它为最终用户提供更好的体验。但是,这意味着服务器需要继续验证令牌及其相应的权限;客户对数据的任何解释纯粹是为了提供可选功能。

    此外,对于部署到恶意环境的客户端,例如SPA应用程序的情况,通过查看数据所做的决定必须只能产生纯粹的美学决策,因为用户可能伪造权限数据。例如,您可以使用它来有条件地隐藏/禁用某些用户界面,这样用户就不必单击它以查明它是不允许这样做的。

    一个很好的比喻是基于Javascript的网络表单输入验证;你应该这样做以获得更好的用户体验,但服务器需要再次这样做,因为用户可以绕过Javascript验证。