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

How do identify a new user using auth0-js WebAuth?

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

我的具体用例是使用 Graphcool 调用 createUser graphql 突变以在我的数据库中创建用户,但显然我只想在用户是新用户时执行此操作。

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

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

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

始终尝试创建用户

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

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

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

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

  • 暂无对应token的注册用户createUser 突变将 return id 一切都很好!

检查用户是否已经登录

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

query {
  user {
    id
  }
}

同样,也有上述两种情况:

  • 已有该token对应的注册用户。在这种情况下,查询 return 是 user object 与相应的用户 id。所以我们可以正常进行应用程序中的流程。

  • 暂无对应token的注册用户。来自 user 查询的日期 return 将为空,因此我们需要调用 createUser 突变,或切换到注册表单或类似的表格。

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

在这种情况下,最简单的解决方案是使用 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,则在您的数据库中创建用户。