Express graphql服务器电子邮件验证示例
我开始使用apollo server express和graphql工具,使用graphql开发一个express API。我的注册用户处理步骤如下: 用户提交用户名、电子邮件和密码 服务器使用uuid生成的唯一链接通过Mailgun向用户发送电子邮件 用户按照链接验证注册 但我正在为如何在分解器中绑定突变而斗争。请参见片段: server.js 分解器上的变异 路由配置 路由配置是我卡住的地方,因为该对象通过graphqlExpress中的上下文传递给所有解析程序Express graphql服务器电子邮件验证示例,express,graphql,apollo-server,Express,Graphql,Apollo Server,我开始使用apollo server express和graphql工具,使用graphql开发一个express API。我的注册用户处理步骤如下: 用户提交用户名、电子邮件和密码 服务器使用uuid生成的唯一链接通过Mailgun向用户发送电子邮件 用户按照链接验证注册 但我正在为如何在分解器中绑定突变而斗争。请参见片段: server.js 分解器上的变异 路由配置 路由配置是我卡住的地方,因为该对象通过graphqlExpress中的上下文传递给所有解析程序 任何人都可以帮助我,或者为我
任何人都可以帮助我,或者为我推荐任何相关的文章。非常感谢。与其使用verifiedUser端点,不如将该逻辑保留在/verify路由的控制器中。比如:
routes.get('/verify?:token', (req, res) => {
Users.updateOne(
{ verification_token: { token } },
{
$set: {is_verified: true},
$unset: {verification_token: {token: ''}}
},
(err, data) => {
const status = err ? 'Failure' : 'Success'
res.render('verified', {title: status})
}
)
})
您将需要3个graphql端点和1个apollo http端点来实现正确的工作流 您可以选择将3个graphql端点组合在一个中,但这将是一个具有许多不同职责的大型函数 1 graphql端点:更改传递请求 需要电子邮件参数 检查是否在db中找到具有此类电子邮件的用户: 生成代码 将其保存在“本地帐户”节点中 使用http链接向用户电子邮件发送代码以确认代码: 返回重定向uri: 对于带有提示确认代码的UI页面 2图形QL端点:更改通过确认 预期代码参数: 如果在db中找到具有此类代码的用户,则返回重定向_uri到UI页面,并在参数中提示使用确认代码进行新的传递: 3图形QL端点:更改过程完成 需要代码和新密码: 散列新密码 在db中搜索具有此代码的本地帐户 3a。如果未找到: 将uri重定向到登录页面时返回错误: 代码不正确,请重试。 3b。如果发现: 更改新密码,返回成功状态并将uri重定向到登录页面: 4 apollo HTTP端点: 如果未提供代码: 重定向到UI注册页面,参数中显示错误消息: 代码不正确,请重试 如果提供代码:在db中搜索具有该代码的本地帐户 1a。如果未找到用户: 重定向到参数中有err mess的reg ui: 代码不正确,请重试。 1.b如果用户发现: 重定向到带有新密码提示的ui页面,并将新代码附加到参数
我没有在上面添加任何代码,因此您可以在其他身份验证场景中使用此工作流。检查我在其中提供的链接是的,阅读这些内容是一条漫长的道路,我从中学到了很多,我在这里遇到的问题是,当服务器发送一个链接mydomain.com/verify?:token给用户,用户点击该链接确认帐户。是的,感谢@Daniel的帮助,我通过将{verify_token:{token:req.params.token}更改为{verify_token:{token token req.params.token}来改进我的情况电子邮件上的url现在很酷,但我的db mongodb没有更新,我将set和unset改为$set和$unset作为mongodb文档
signupUser: async (root, data, {mongo: { Users }}) => {
// Check existed accounts,
// if account is not exist, assign new account
const existed = await Users.findOne({email: data.email})
if (!existed) {
// create a token for sending email
const registrationToken = {
token: uuid.v4(),
created_at: new Date(),
expireAfterSeconds: 3600000 * 6 // half day
}
const newUser = {
name: data.name,
email: data.email,
password: await bcrypt.hash(data.password, 10),
created_at: new Date(),
verification_token: registrationToken,
is_verified: false,
}
const response = await Users.insert(newUser)
// send and email to user
await verifyEmail(newUser)
return Object.assign({id: response.insertedIds[0]}, newUser)
}
// Throw error when account existed
const error = new Error('Email existed')
error.status = 409
throw error
},
// VERIFY USER
// Set verify to true (after user click on the link)
// Add user to mailist
verifiedUser: async (root, data, {mongo: { Users }}) => {
await Users.updateOne(
{ email: data.email },
{
set: {is_verified: true},
unset: {verification_token: {token: ''}}
}
)
},
routes.get('/verify?:token', (req, res, next) => {
res.render('verified', {title: 'Success'})
})
routes.get('/verify?:token', (req, res) => {
Users.updateOne(
{ verification_token: { token } },
{
$set: {is_verified: true},
$unset: {verification_token: {token: ''}}
},
(err, data) => {
const status = err ? 'Failure' : 'Success'
res.render('verified', {title: status})
}
)
})