Express graphql服务器电子邮件验证示例

Express graphql服务器电子邮件验证示例,express,graphql,apollo-server,Express,Graphql,Apollo Server,我开始使用apollo server express和graphql工具,使用graphql开发一个express API。我的注册用户处理步骤如下: 用户提交用户名、电子邮件和密码 服务器使用uuid生成的唯一链接通过Mailgun向用户发送电子邮件 用户按照链接验证注册 但我正在为如何在分解器中绑定突变而斗争。请参见片段: server.js 分解器上的变异 路由配置 路由配置是我卡住的地方,因为该对象通过graphqlExpress中的上下文传递给所有解析程序 任何人都可以帮助我,或者为我

我开始使用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})
    }    
  )
})