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

Daw*_*ski 4 javascript express graphql

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

hel*_*fer 7

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

我当时可以提供最好的链接是这个职位,我写了前段时间有关设置验证的GraphQL端点Passport.js.我希望它有所帮助!

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


小智 5

我目前正在评估对具有 express、passport 和 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);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我承诺了护照认证:

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);
    }),
};
Run Code Online (Sandbox Code Playgroud)

由于关于如何涵盖这一点的示例并不多,我一直在努力使其变得简单,但我认为我做得很好。

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