如何使用 auth0-js WebAuth 识别新用户?

Posted

技术标签:

【中文标题】如何使用 auth0-js WebAuth 识别新用户?【英文标题】:How do identify a new user using auth0-js WebAuth? 【发布时间】:2017-11-28 10:16:39 【问题描述】:

我试图让事情变得简单,并使用 auth0-js WebAuth 对用户进行身份验证。但是,由于涉及重定向,因此我无法控制此时的注册功能。

我的具体用例是使用 Graphcool 调用 createUser graphql 突变以在我的数据库中创建一个用户,但显然我只想在用户是新用户时这样做。

我的问题:使用 auth0-js,是否可以在从 Auth0 重定向回我的客户端应用程序后识别用户是我的客户端应用程序中的新用户还是现有用户(假设身份验证是成功的)?

【问题讨论】:

【参考方案1】:

这里有两种通用方法,都需要您在收到 Auth0 令牌后将其保存在本地存储中。您可以为 GraphQL 客户端使用中间件,该中间件会为每个请求检查本地存储中的令牌,并将其包含为 Authorization: Bearer <token> 标头(如果存在)。

现在让我们看看这两种方法。

总是尝试创建用户

在收到令牌后尝试使用createUser 突变创建用户是一种相当简单的方法。这就是突变的样子:

mutation signUp($token: String!) 
  createUser(authProvider: 
    auth0: 
      idToken: $token
    
  ) 
    id
  

现在,如果令牌有效并且与 Graphcool 中的 Auth0 集成的配置相匹配,则有两种可能的情况。请注意,如果嵌入的auth0UserId 匹配,则令牌对应于用户。

已经有一个注册用户对应token。在这种情况下,将返回 GraphQL 错误 Code 3023: CannotSignUpUserWithCredentialsExist(与 error reference documentation 比较)。在您的应用程序中,您可以捕获此错误以正常进行。

目前还没有与令牌对应的注册用户createUser 突变将返回 id,一切都很好!

检查用户是否已经登录

如果您有更详细的注册流程,您可能希望将用户重定向到注册表单,而第一种方法实际上无法做到这一点。相反,我们可以在继续之前检查当前使用的令牌是否对应于注册用户。您可以使用user 查询来做到这一点:

query 
  user 
    id
  

同样,有与上述相同的两种情况:

已经有一个注册用户对应token。在这种情况下,查询返回一个user 对象和对应的用户id。这样我们就可以在应用程序中正常进行流程了。

目前还没有与令牌对应的注册用户user 查询返回的日期将为空,因此我们需要调用 createUser 突变,或切换到注册表单或类似的形式。

将此与 Graphcool 文档中的 this FAQ article 进行比较。

【讨论】:

【参考方案2】:

在这种情况下,最简单的解决方案是使用 auth0 规则并使用 context.stats.loginsCount 字段来检测用户是否为新用户。 https://auth0.com/docs/rules/references/context-object

您可以使用规则将 context.stats.loginsCount 字段值添加为令牌中的自定义声明。因此,在您的应用程序中,您可以向/userinfo 端点发出 HTTP 请求以获取令牌数据。

function (user, context, callback) 

     const count=context.stats.loginsCount;
     context.idToken["http://mynamespace/logincounts"] = count;


  callback(null, user, context);

https://auth0.com/docs/api-auth/tutorials/adoption/scope-custom-claims

如果计数等于 1,则在您的数据库中创建用户。

【讨论】:

以上是关于如何使用 auth0-js WebAuth 识别新用户?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Auth0.swift WebAuth0 设置初始屏幕

netscreen webauth with windows ad account and group via freeradius

如何识别安装和删除应用程序的用户 - 如何在新架构中使用 UNNEST

linux不重启识别新硬盘

在linux系统里,如何检查新插入的USB设备是不是被系统识别?

如何让 iTunes Connect 识别新的 Bundle ID