在每个API调用之前验证JWT令牌

时间:2020-06-01 21:10:55

标签: javascript reactjs react-router jwt mern

目前,我正在React的一个项目中工作,该项目具有受保护的路由(受JWT授权保护)。
根据用户的权限,某些页面的呈现方式有所不同。 这些权限在令牌有效负载中加密。

由于可以对JWT令牌进行解密和更改,因此理论上,用户可以 更改令牌,以访问他们实际上不应该访问的页面。 由于令牌失去了有效性,因此后端服务器将不会处理该特定用户的任何请求,因此不会造成任何损害。

我仍然不希望用户仅通过更改JWT令牌就能够访问受保护的页面。我对此问题的解决方案是将请求发送到验证令牌的端点。 根据端点的响应,将进行第二次API调用,然后将返回受保护页面的所需数据。 如果验证端点返回该令牌不再有效,则该用户将被重定向到登录页面。


登录>转到受保护的页面>验证令牌>访问受保护的页面
登录>更改收到的JWT令牌>转到受保护的路由>验证令牌>错误>登录页面


现在我的问题是:这是解决此问题的好方法吗?有更好的方法吗?

非常感谢您。 :)

1 个答案:

答案 0 :(得分:0)

JWT令牌包含3个部分:

  • 标题
  • 有效载荷
  • 签名

签名用于验证标头和有效载荷未更改。因此,攻击者需要为更改的令牌创建新的签名。从理论上讲,没有您的密钥几乎不可能创建有效的签名。

您建议的额外步骤不会执行任何操作。如果您的客户可以成功更改密钥,那么她可以轻松地绕过此步骤,并对受保护的资源进行API调用。

令牌验证步骤应在后端完成。

  • 登录(前端)>转到受保护的路由(前端)>验证令牌(后端)>返回受保护的页面(后端)

  • 登录(前端)>更改收到的JWT令牌(前端)>转到受保护的路由(前端)>验证令牌(后端)>返回错误(后端)>登录页面(前端)

修改 要在前端向用户隐藏视图:

  • 如果您使用非对称密钥,则可以在前端验证JWT(使用公共密钥)而无需发出请求。
  • 或者如上所述,您可以创建一个端点来验证令牌。