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

时间:2017-06-25 09:38:50

标签: javascript authentication auth0 graphcool

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

我的具体用例是使用Graphcool调用createUser graphql变异来在我的数据库中创建用户,但是如果用户显然是新用户,我只想这样做。

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

2 个答案:

答案 0 :(得分:2)

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

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

始终尝试创建用户

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

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

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

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

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

检查用户是否已登录

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

query {
  user {
    id
  }
}

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

  • 已存在与令牌对应的注册用户。在这种情况下,查询将返回具有相应用户user的{​​{1}}对象。所以我们可以正常进行应用程序中的流程。

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

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

答案 1 :(得分:0)

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