【问题标题】:How to manage users on backend when using Auth0 Lock?使用 Auth0 Lock 时如何在后端管理用户?
【发布时间】:2017-04-11 02:10:10
【问题描述】:

我正在创建一个使用 React 的前端和一个使用 Node.js 的后端。我想使用 Auth0 Lock 管理用户信息 - 向 API 发送每个请求的 JWT。

如果我需要做以下事情之一怎么办?

  • 使用作者 ID 存储博客文章

Auth0 唯一标识符是user_id,它不是整数,因此不能用作 ID/密钥。我将如何在服务器端用户存储上处理这个问题?

  • 有一个用户表来存储“个人资料”或其他类似信息

我是否在每个 API 请求上读取 JWT,确定该用户是否存在,如果不存在则创建一个新用户,或者如果存在则将其与预先存在的用户相关联。在每个 API 请求上检查用户数据库是否高效?

我不确定如何使用基于 JWT 的 API 和 Auth0 处理一般流程。

编辑:

我的一些研究和反思后的想法:Auth0的唯一用户标识符由他们提供为user_id。这里的问题是它不是整数。因此,它不应用作数据库中users 表的键。

似乎您不应该在每个请求上检查用户数据库,但这可能是不正确的。一个想法是在初始登录时回调到后端,如果帐户不存在,则创建它,如果帐户确实存在,则继续。然后,在用户登录前端后,只需在每个后续请求中信任 Auth0 JWT(如果它在后端验证)。

从我在网上看到的对这个过程的极少数描述来看,我描述的方式似乎是正常的方式。但是在某些情况下它没有意义。如果要禁止用户怎么办?他们仍然可以使用活动的 JWT 访问服务器功能,直到过期。

那么,如果在每个 API 请求上检查用户存储是正常/高效的,我如何将 Auth0 的字符串 ID user_id 与数据存储中的整数 ID 关联起来进行查询?我正在使用 SQL 变体。

【问题讨论】:

  • 解决您的被禁用户问题的方法是使用缓存。在第一次调用时,您的应用程序检查缓存,如果它们不存在,缓存将尝试从数据库中获取它们,然后返回该用户信息。当用户被封禁时,封禁代码也必须将用户从缓存中清除,这样下次拉取新数据时,也会得到封禁标志。

标签: javascript node.js reactjs jwt auth0


【解决方案1】:

如何识别用户

您没有明确说明您使用哪种数据库技术,但通常您应该能够使用常规字符串作为标识符/键。您确实提到您正在使用 SQL 变体,因此这可能是问题的根源;您可能应该使用具有足够固定长度的更具体的基于文本的数据类型。

user_id 是 Auth0 身份提供者标识符与该提供者中的用户标识符连接的结果,因此我们可以争辩说,达到确定的最大长度有点棘手。但是,您可以决定任意值,例如,640 个字符应该对任何人都足够了。

您还可以通过电子邮件识别您的用户;如果您的应用程序使用的每个身份验证提供程序都要求用户提供他们的电子邮件,并且您也不打算支持具有相同电子邮件地址的不同帐户,则此方法有效。

最后一种选择是您为每个用户分配您自己的唯一标识符,该标识符更适合您打算如何使用它。您可以通过使用具有此新属性的 Auth0 rule update your user metadata 来实现此目的,然后请求此属性为 included in the generated token upon user authentication by the means of scopes

根据方法,您既不需要简单的查找表,也不需要将一种形式的标识符映射到内部标识符,或者在使用内部标识符更新用户元数据的情况下,您可以完全跳过该查找表,而只跳过来自的值智威汤逊。

如何处理新用户

正如您所提到的,您可以在每个 API 请求中确保如果这是新用户发出的第一个请求,那么您可以在处理请求之前创建应用程序配置文件的概念。

当您检测到用户首次注册然后在 API 上始终假定配置文件存在时,替代方法是在 Auth0 内触发此应用程序配置文件创建。

这两种方法都有效;我会选择一种可以让您实现更简单并且仍然满足您的要求的方法。

如何处理被封禁的用户

如果您确实需要支持立即禁止用户的功能并且不允许对 API 的任何其他请求,那么您将始终必须在每个 API 请求中进行某种查询,以查看用户是否被禁止或不。这会显着增加复杂性,因此请考虑您可以容忍令牌的生命周期较短且被禁止用户仍可在短时间内调用您的 API 的解决方案。

【讨论】:

  • 所以我觉得这可能是最好的选择:添加一个 Auth0 规则,为每个用户的 JWT 提供一个唯一的整数 ID(仍在研究如何执行此操作)。然后,在每次登录时(来自前端的 Auth0 Lock),回调到 Node 后端并使用来自 JWT 的信息在 MySQL 用户表中创建/更新用户。从 Auth0 规则创建的唯一整数 ID 将用作主键。这行得通吗?您有任何更改或建议吗?
  • 是的,这行得通;只是两个小注释,关于您的工作规则和更新用户配置文件,而不是直接更新 JWT,但它具有相同的最终结果。此外,您不需要在每次登录时都调用后端,您可以在第一次登录时调用,在后续登录时只需跳过该步骤。检查this sample rule 是否有类似内容。
  • 但是如果我希望更新用户记录,例如,如果他们更改了他们用于登录的 Facebook 帐户的电子邮件或名称,那么我是否需要在每次登录时调用?另外,是否有添加唯一 ID 的示例规则?感谢您的帮助!
  • 在这种情况下,您是对的,您将在每次登录时更新以保持数据同步。我不知道任何现有的添加唯一标识符的示例规则。
  • @Connorelsea 你是怎么解决这个问题的?我在同一条船上,我很惊讶在应用程序的后端没有关于维护用户配置文件的示例或文档。我目前的想法是我的回调端点会向后端发出调用,以便后端知道用户已登录,但不确定这是否是正确的方法。看起来它可能会出错,如果没有在后端创建用户,我的应用程序最终会处于错误状态。
猜你喜欢
  • 2016-05-03
  • 2017-07-11
  • 2017-05-25
  • 1970-01-01
  • 2018-11-03
  • 2017-01-31
  • 2019-09-11
  • 2017-03-08
  • 2019-11-07
相关资源
最近更新 更多