如何在使用Auth0 Lock时管理后端用户?

时间:2016-11-27 05:05:50

标签: javascript node.js reactjs jwt auth0

我正在使用React创建一个前端,并使用Node创建一个后端。我想使用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变体。

1 个答案:

答案 0 :(得分:5)

如何识别用户

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

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

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

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

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

如何处理首次使用的用户

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

当您检测到用户第一次注册然后在API上始终假定该配置文件存在时,替代此操作将触发从Auth0内创建此应用程序配置文件。

两种方法都有效;我会选择一个能让你更简单实现并且仍能满足你要求的那个。

如何处理被禁用的用户

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