【问题标题】:best practices for determing a user or admin from rest api从 rest api 确定用户或管理员的最佳实践
【发布时间】:2020-05-14 23:13:30
【问题描述】:

我正在创建一个 REST API 来服务于前端,但我不清楚一些事情,希望有人能阐明这种方法的最佳实践。

API 是 Fl​​ask,我使用的是 JWT。因此,当用户正确进行身份验证(传递正确的用户名/md5 密码)时,我将传回 JWT。我还根据用户名将 JWT 存储在数据库中,以确保在任何给定时间每个用户只有一个 JWT。即使他从另一台 PC 登录,我也创建了一个将当前令牌列入黑名单的程序。

我不清楚的是前端(比如 Angular)如何确定用户是管理员还是标准用户。我应该回传(例如 0 或 1)以便前端知道隐藏某些导航链接吗?如果您将某些内容存储到 cookie 中,用户仍然可以更改该值并访问管理链接,所以也许这就是我感到困惑的地方。

另外,在前端,您如何检查用户是否已被撤销?假设他已登录,令牌被撤销,然后点击另一个仅限会员的链接。我们是否应该查看其余响应以确定他是否有效?例如,如果令牌过期,我们返回“Token Revoked”

谢谢!

【问题讨论】:

  • FWIW,使用 JWT 数据库状态在某种程度上违背了目的。 JWT 主要是为了让您的后端可以是无状态的。
  • 是的,将 some 标志从您的登录 REST API 传递回您的前端,告诉它它是什么类型的用户。即使您的用户在客户端操作某些东西,他们也可能能够访问 admin 模板 等,但他们永远无法从 API 获取 admin data .如果您甚至想隐藏模板,那么您需要在登录后从服务器获取它们并在那里进行权限检查。
  • @deceze 如果您不存储令牌,那么您如何跟踪谁拥有什么令牌并使令牌无效?
  • 我的意思是,如果您需要这种状态,那么您可以只使用会话 ID 之类的东西而不是 JWT。不过这并不重要。
  • @deceze thans 对于这些点

标签: angular rest api jwt


【解决方案1】:

JWT 对你所说的一切都有解决方案。

在 JWT 令牌中,您可以编写任何您想要的内容,用户名、令牌过期时间、角色等。NPM 中有一些库可以添加到您的项目中,并使用它们来读取令牌声明。

另一种方法是,您可以创建一个 API 来提供有关当前请求的额外信息。例如,在 Angular 中获取令牌后,您使用令牌调用 API,服务器会告诉您您的权限、过期时间等。

另外,在前端,你如何处理检查用户是否有 被撤销了?

一种选择是编写一个 HTTP 拦截器并监视服务器的响应状态代码。如果服务器以 401 响应,则表示您未经过身份验证,并且您没有附加任何令牌,或者如果您附加了任何令牌,则它已过期,还有两个非官方 HTTP 状态代码:498 表示无效令牌,499 表示需要令牌你可以在你的后端使用。

另一个选项是监控您应该从服务器获取的令牌过期时间。同样,HTTP 拦截器将进行数学运算并检查当前令牌是否仍然有效。

【讨论】:

  • 我喜欢这些点,非常感谢。我决定在数据库中保存针对用户的令牌,以确保一次只向任何用户提供一个有效令牌,并在他们再次登录或注销时使该令牌无效,或者如果用户被编辑行政。拦截的选项不错,非常感谢
【解决方案2】:

通常,您会在页面加载时检索用户配置文件(您未保存在 JWT 中的所有信息)。如果您正在构建单页应用程序,这将发生一次。该数据将包含有关用户及其权限的信息。请注意,在 Javascript 中返回的任何内容都可以更改,并且永远不应被您的后端信任。这就是验证您的用户权限前端和后端很重要的原因。

至于您的撤销令牌问题,再一次,验证是后端的工作。你的前端可以有一个中间件来监听无效的令牌响应并做相应的事情。你的令牌也有一个过期日期,我不喜欢使用它,但它在那里。

【讨论】:

  • 所以可以给前端返回一个 0 或 1 让他们知道什么样的用户正在登录?我让 API 层使用 JWT 对所有请求进行身份验证,因此即使用户能够更改某些值(0 或 1)以查看管理页面,他仍然无法访问数据。对于过期的令牌,是不是前端会检查响应,如果它说“令牌过期”,用户就退出了?
  • 确切地说,用户将通过他们看到的数据知道他们是什么类型的用户。因此,此时,只要您验证后端的每个操作,就可以了。至于你过期的令牌,这正是我会做的。您有一个检查响应的中间件,如果其中一个类似于401, expired token,则将它们重定向到登录页面。 @dataviews
猜你喜欢
  • 2022-01-06
  • 1970-01-01
  • 2019-06-07
  • 2013-10-23
  • 1970-01-01
  • 2020-04-13
  • 2020-05-29
  • 1970-01-01
相关资源
最近更新 更多