使用快递js,护照s保护GraphQL查询

时间:2017-03-19 11:24:10

标签: javascript express graphql

我已经开始在我的快递js项目中使用graphql,但我想知道如何保护我的一些GraphQL查询。 以前我使用护照js(JWT),这很好用。安全路线真的很容易但是使用graphql(express-graphql)我找不到任何解决方案。 此外,拥有某种基于角色的解决方案来保护特定领域将会很不错。有没有什么好的教程如何保护graphQL?

2 个答案:

答案 0 :(得分:7)

最后我检查过那里没有任何真正好的教程,展示了如何保护GraphQL端点。然而,社区中的共识(GraphQL和Apollo松弛渠道)是最好的做法与GraphQL分开进行身份验证(例如使用Passport)并在您的解析功能中进行授权,可能通过以某种角色进行装饰 - 基于身份验证。

我目前可以提供的最佳链接是this post我刚才写过关于使用Passport.js为GraphQL端点设置身份验证的问题。我希望它有所帮助!

我目前正在使用Apollo为React + Node.js编写一个Full-stack GraphQL教程,我正计划参与Auth。我会在发布后立即尝试更新此答案。

答案 1 :(得分:4)

我目前正在评估使用快递,护照和jwt对旋转变压器进行授权的可能性。它没有经过全面测试,但确实有效。

为此,您需要在上下文中至少传递请求:

const graphql = graphqlExpress((req, res) => {
  return ({
    schema,
    rootValue: resolver,
    // For query authorization. Ideally, Passport will handle all requests and authenticate
    // each one for the current user. The queries will fetch data exclusively related to that user.
    context: { req, res },
  });
});
// The api
app.use('/api', graphql);

在这种情况下,我宣布了护照认证:

const auth = (req, res) => new Promise((resolve, reject) => {
  passport.authenticate('jwt', { session: false }, (err, user) => {
    if (err) reject(err);
    if (user) resolve(user);
    else reject('Unauthorized');
  })(req, res);
});

const resolver = {
  users: (root, ctx) => auth(ctx.req, ctx.res)
    .then(() => User.find({}, (err, res) => res))
    .catch((err) => {
      throw new Error(err);
    }),
};

由于没有那么多关于如何解决这个问题的例子,我一直在努力使其变得简单,但我认为我做得很好。

以下是我用来达到这一点的资源: