如何从graphql突变返回令牌

Posted

技术标签:

【中文标题】如何从graphql突变返回令牌【英文标题】:how to return token from graphql mutation 【发布时间】:2018-12-19 01:11:57 【问题描述】:

这是我的突变代码,其中我使用具有名称、电子邮件、密码的用户类型,并且我为注册用户和登录用户进行了两次突变。我已经搜索了有关 graphql 的所有文档并阅读了所有与身份验证相关的博客,但无法得到从突变中返回令牌的答案

    const mutation = new GraphQLObjectType(
      name: "Mutation",
      fields: 
        addUser: 
          type: UserType,
          args: 
            name:  type: GraphQLString ,
            email:  type: GraphQLString ,
            password:  type: GraphQLString ,
            avatar:  type: GraphQLString 
          ,
          resolve(parentValue, args) 
            const avatar = gravatar.url(args.email);
            return bcrypt
              .hash(args.password, 10)
              .then(hash => 
               args.password = hash;
               const newUser = new User(
                  name: args.name,
                  email: args.email,
                  password: args.password,
                  avatar
                );
                return newUser
                  .save()
                  .then(user => user)
                  .catch(e => e);
              )
               .catch(e => e);
          
        ,
        login: 
          name: "Login",

          type: UserType,
          args: 
            email:  type: GraphQLString ,
            password:  type: GraphQLString 
          ,
          resolve(parentValue, args, context) 
            return User.findOne( email: args.email )
              .then(user => 
                if (user) 
                  return bcrypt
                    .compare(args.password, user.password)
                    .then(isValid => 
                      if (!isValid) 
                        throw new Error( message: "password Incrrect" );
                       else 
                        const token = jwt.sign(
                           name: user.name, id: user.id ,
                          "mySecret"
                        );
                        return user;
                      
                    )
                    .catch(e => e);
                 else 
                  throw new Error( message: "email Incorrect" );
                
              )
              .catch(e => e);
          
        
      
    );

这是我的用户类型

    const UserType = new GraphQLObjectType(
      name: "User",
      fields: 
        id:  type: GraphQLString ,
        name:  type: GraphQLString ,
        email:  type: GraphQLString ,
        password:  type: GraphQLString ,
        avatar:  type: GraphQLString 
      
    );

【问题讨论】:

【参考方案1】:

我建议您通过删除密码字段并添加一个令牌字段来更新您的UserType

const UserType = new GraphQLObjectType(
      name: "User",
      fields: 
        id:  type: GraphQLString ,
        name:  type: GraphQLString ,
        email:  type: GraphQLString ,
        avatar:  type: GraphQLString ,
        token:  type: GraphQLString 
      
 );

原因是UserType是突变的返回类型,所以它是“public”的,也许我们不应该向public发送密码(因为我们在服务器端进行身份验证),但是JWT是public的,这样我们就可以把它寄回去了。

并在您的 login 突变中将令牌添加到用户对象中,例如:

   login: 
      name: "Login",
      type: UserType,
      args:  email:  type: GraphQLString , password:  type: GraphQLString  ,
      resolve(parentValue, args, context) 
        return User.findOne( email: args.email )
          .then(user => 
        .........
                    const token = jwt.sign(
                       name: user.name, id: user.id ,
                      "mySecret"
                    );
                    user.token = token;
                    return user;
                  
        ........
      
    

【讨论】:

以上是关于如何从graphql突变返回令牌的主要内容,如果未能解决你的问题,请参考以下文章

从 Promise 返回数据到 GraphQL

如何从graphql突变返回新记录而不是null

Graphql 突变返回 Post 400 错误,不知道如何解决

在 Angular Apollo Graphql 中访问突变结果

如何结合突变在 django-graphql-jwt 中创建或登录用户?

graphql 突变不返回嵌套字段