我试图让事情变得简单,并使用 auth0-js WebAuth 对用户进行身份验证。但是,由于涉及重定向,因此我无法控制注册功能。
我的具体用例是使用 Graphcool 调用createUser
graphql 突变以在我的数据库中创建一个用户,但显然我只想在用户是新用户时这样做。
我的问题:使用 auth0-js,是否可以在从 Auth0 重定向回我的客户端应用程序后识别用户是我的客户端应用程序中的新用户还是现有用户(假设身份验证成功)?
我试图让事情变得简单,并使用 auth0-js WebAuth 对用户进行身份验证。但是,由于涉及重定向,因此我无法控制注册功能。
我的具体用例是使用 Graphcool 调用createUser
graphql 突变以在我的数据库中创建一个用户,但显然我只想在用户是新用户时这样做。
我的问题:使用 auth0-js,是否可以在从 Auth0 重定向回我的客户端应用程序后识别用户是我的客户端应用程序中的新用户还是现有用户(假设身份验证成功)?
这里有两种通用方法,都要求您在收到Auth0 令牌后将其保存在本地存储中。您可以为 GraphQL 客户端使用中间件,该中间件会检查本地存储中的每个请求的令牌,并将其作为Authorization: Bearer <token>
标头(如果存在)包含在内。
现在让我们看看这两种方法。
尝试在createUser
收到令牌后立即使用突变创建用户是一种相当简单的方法。这是突变的样子:
mutation signUp($token: String!) {
createUser(authProvider: {
auth0: {
idToken: $token
}
}) {
id
}
}
现在,如果令牌有效并且与 Graphcool 中的 Auth0 集成的配置相匹配,则有两种可能的情况。auth0UserId
请注意,如果嵌入的令牌匹配,则令牌对应于用户。
已经有一个注册用户对应token。Code 3023: CannotSignUpUserWithCredentialsExist
在这种情况下,将返回GraphQL 错误(与错误参考文档进行比较)。在您的应用程序中,您可以捕获此错误以正常进行。
还没有与令牌对应的注册用户。createUser
突变会回来,id
一切都很好!
如果您有更详细的注册流程,您可能希望将用户重定向到注册表单,这在第一种方法中实际上是不可能的。相反,我们可以在继续之前检查当前使用的令牌是否对应于注册用户。您可以使用user
查询来做到这一点:
query {
user {
id
}
}
同样,有与上述相同的两种情况:
已经有一个注册用户对应token。在这种情况下,查询返回一个user
具有相应用户的对象id
。这样我们就可以在应用程序中正常进行流程了。
还没有与令牌对应的注册用户。查询返回的日期user
将为空,因此我们需要调用createUser
突变,或切换到注册表单或类似形式。
将此与 Graphcool 文档中的FAQ 文章进行比较。
在这种情况下,最简单的解决方案是使用 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,则在您的数据库中创建用户。