我试图保持简单并使用auth0-js WebAuth对用户进行身份验证。但是,由于涉及重定向,我在此时无法控制注册功能。
我的具体用例是使用Graphcool调用createUser
graphql变异来在我的数据库中创建用户,但是如果用户显然是新用户,我只想这样做。
我的问题:使用auth0-js,可以在从Auth0重定向回我的客户端应用程序之后识别用户是否是我的客户端应用程序中的新用户或现有用户(假设身份验证是成功的)?
答案 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,则在数据库中创建用户。