使用JWT进行身份验证时如何区分用户类型

Pat*_*ors 4 node.js jwt reactjs

目前,在我的应用程序(Mongo,Express,Node,React)中,我正在使用JSON Web令牌对从客户端到服务器的用户进行身份验证。但是,我希望能够让两种不同类型的用户访问该应用程序的不同部分。最好的方法是什么?目前,我将两种类型的用户保存在同一模型中,并使用布尔值区分它们。要澄清的是,不同类型的用户将能够访问不同的API以及客户端应用程序的不同部分。

是否有处理此问题的包装?JWT功能?

Luc*_*oni 6

您可以通过2种方式执行此操作:

  1. 在编码JWT令牌时,还对用户角色进行编码。
  2. 例如,当您解码JWT令牌并获取用户的ID时,请查询数据存储以获取该用户的角色。

大多数软件包将允许您定义要编码的内容。

提示:

  1. 始终对令牌设置过期时间。它只是存储在JWT中的日期。解码令牌时,只需确保该日期是将来的日期即可,如果不能拒绝访问的话。

  2. 创建一个检查用户角色的中间件。例如:

router.get('/restricted-area', requiresAdmin, (req, res, next) => {
  // only admin can access this
});

function requiresAdmin(req, res, next) {
  if(req.user.admin !== true) {
     res.status(401).end();
  } else {
     next();
  }
}
Run Code Online (Sandbox Code Playgroud)


EJ *_*son 6

想在建议的答案中添加一点。我从 Auth0 如何使用 jwt 中学到了很多东西。您可能想尝试一下,看看他们如何处理身份验证和保护他们的路由。另一件真正帮助我理解使用 jwt 的方法是在jwt 网站上使用调试器。

允许用户访问不同的 API 端点

任何人都可以解码jwt 令牌。任何人都可以看到令牌上的内容。jwt 的重要部分是它有一个签名。如果有人想要获取令牌,更改信息,然后访问您的 api,那么签名将被搞砸并且该令牌应该被拒绝。

您需要做的就是创建一个路由中间件。如果路由受到保护,则用户在标头中发送 jwt。中间件将做两件事:

  1. 检查令牌的签名以确保令牌有效且未被篡改。

  2. 解码令牌以查看 JSON 上的内容。由于 jwt 只是一个 JSON,您可以向其添加任何您想要的属性。添加属性权限并设置用户权限的级别。这是 auth0 的教程,介绍了像 slack 这样的现实生活中的公司如何使用 jwt 令牌来定义用户可以做什么和不能做什么。许多相同的原则适用于您想要做的事情。带有多租户应用程序的 Auth0

如何使用 React 在客户端限制用户?

我在评论中看到了这个问题,如果有人感兴趣,我会在这里抛出答案。如果有人真的想要,他们可以拿走他们的令牌,更改它,然后访问任何视觉组件(作为反应)。出现这种情况的原因是您不想在客户端上保留任何令牌签名机密。可就算有人换了他们的令牌,他们也无法造成任何伤害。如果他们尝试向服务器发送请求,他们的令牌将被拒绝,您的 api 将受到保护。

反应路由器和动态路由

对于 99.9% 的用户不会弄乱他们的令牌,决定他们允许使用站点哪些部分的最佳方法是使用react-router。由于 React 是一个单页应用程序,因此只有一个静态 html 文件会将您的构建发送到客户端。对于其他框架,您服务器上的不同路由将在不同的静态端点发送不同的页面。为了用 React 模仿这个页面行为,人们使用 React Router 是很常见的。React Router 创建动态路由,因此当用户将端点插入浏览器时,它可以模仿典型静态站点的工作方式。

它还可用于限制用户访问某些组件。用户登录后,您可以发送解码的令牌信息并将其保存到您的反应状态。其中之一是您的权限参数。使用 react router,当用户尝试导航到需要权限的位置时,您可以引用他们的状态并将它们重定向到受保护的组件或返回到授权的捕获、返回到它们来自的位置、登录页面等。基本上哪里都行。

这是反应路由器文档站点上关于实现受限端点的一个稍微令人困惑的实现。

来自 auth0 的另一个教程使用 react router 来限制用户。滚动到标题处理身份验证结果