我有一个与 API 通信的单页应用程序 (SPA)。我创建了一个非常简单的身份验证系统:用户登录并获取存储在用户本地存储中的 JSON Web 令牌 (JWT)。
我在 API 上还有一个端点,让我检查令牌是否仍然有效。
我应该在每次用户导航到 SPA 上的不同页面时调用此端点,还是应该仅在用户想要访问将使用令牌进行请求的站点区域时调用它?
我有一个与 API 通信的单页应用程序 (SPA)。我创建了一个非常简单的身份验证系统:用户登录并获取存储在用户本地存储中的 JSON Web 令牌 (JWT)。
我在 API 上还有一个端点,让我检查令牌是否仍然有效。
我应该在每次用户导航到 SPA 上的不同页面时调用此端点,还是应该仅在用户想要访问将使用令牌进行请求的站点区域时调用它?
这取决于。
如果您需要令牌进行身份验证并且不允许未经身份验证的用户访问任何内容,则应检查其对每个请求的有效性。
如果您只在需要其中的一部分信息时检查令牌 - 并且可以匿名访问所有其他站点,那么您不需要在每个请求上都检查它。
请注意,当您不需要来自令牌的信息但又想限制登录用户的访问权限时,很容易忘记检查令牌,因此一直检查令牌似乎是个好主意,特别是因为您似乎暗示每个请求应该有一个令牌。
我第二个@SmokeDispenser 的回答。
您还没有告诉我们您将哪些内容放入 JWN,但总的来说,JWT 提供了两件事:
证明这是一个真实的登录用户。
包含用于执行访问控制列表 (ACL) 规则的信息,即能够询问“是否允许此用户查看/修改此资源?”。
所以我会翻转这个问题并询问每个 API 或请求类型:
服务器是否需要知道用户的身份才能处理此请求?
对于完全公开的 API 调用(不需要身份验证),那么No,您没有理由检查 JWT。
对于所有其他情况,如果未登录的人尝试访问它,您应该返回 403 Forbidden。所以是的,您需要检查每个请求的 JWT;至少 JWT 没有过期,并且可能还有这个用户有权访问这个资源。