📜  如何在 graphql 中使用哨兵 (1)

📅  最后修改于: 2023-12-03 15:08:37.528000             🧑  作者: Mango

如何在 GraphQL 中使用哨兵

GraphQL 是一种用于 API 的查询语言,它的特点是可以让开发者指定需要的数据,这样可以减少无用数据的传输,提升 API 的响应速度。其中一个重要的安全策略就是使用哨兵来保护 API 的资源。

在本文中,我们将介绍如何在 GraphQL 中使用哨兵来保护 API 的资源,以及如何设置哨兵的规则。

什么是 GraphQL 哨兵?

GraphQL 哨兵是一种用于控制图形化数据的安全策略,主要用于保护 API 的访问资源,通过定义规则限制请求,以保证 GraphQL API 的安全性。

如何在 GraphQL 中使用哨兵?

要在 GraphQL 中使用哨兵,需要遵循以下步骤:

步骤 1:配置 GraphQL 服务

第一步是配置 GraphQL 服务。可以使用 Node.js 和 Express 创建 GraphQL 服务。接下来,我们将快速浏览如何配置 GraphQL 服务。

const { graphqlHTTP } = require('express-graphql')
const { buildSchema } = require('graphql')

// 定义 GraphQL schema
const schema = buildSchema(`
  type Query {
    hello: String
    products: [Product]
  }

  type Product {
    id: ID!
    name: String!
    price: Int!
  }
`)

// 模拟一个简单的产品列表
const products = [
  {id: 1, name: 'Product 1', price: 100},
  {id: 2, name: 'Product 2', price: 200},
  {id: 3, name: 'Product 3', price: 300},
]

// 定义 GraphQL resolver
const root = {
  hello: () => 'Hello world!',
  products: () => products,
}

// 创建 GraphQL 服务
app.use('/graphql', graphqlHTTP({
  schema: schema,
  rootValue: root,
  graphiql: true,
}))
步骤 2:安装 GraphQL Shield

接下来,安装 GraphQL Shield,这是一个用于保护 GraphQL API 的库。

npm install graphql-shield
步骤 3:定义规则

定义规则是使用哨兵的最后一步。要定义规则,您需要首先定义一个逻辑函数来判断用户是否有权访问特定的字段。

const { shield, rule } = require('graphql-shield')

const isAuthenticated = rule()((parent, args, context, info) => {
  return context.user !== null
})

const permissions = shield({
  Query: {
    products: isAuthenticated,
  },
})

在这个小例子中,我们定义了名为 isAuthenticated 的规则,用于判断用户是否已通过身份验证。接下来,我们将这个规则添加到 permissions 中。

我们还可以为多个规则添加别名:

const isAuthenticated = rule()((parent, args, context, info) => {
  return context.user !== null
})

const isAdmin = rule()((parent, args, context, info) => {
  return context.user.role === 'admin'
})

const permissions = shield({
  Query: {
    products: isAuthenticated,
    adminData: isAdmin,
  },
})
步骤 4:将规则应用到 GraphQL

现在已经定义了规则,可以将它们应用到 GraphQL 中。要应用规则,只需要编写中间件,并在服务的配置中添加该中间件。

const { applyMiddleware } = require('graphql-middleware')

const schemaWithMiddleware = applyMiddleware(schema, permissions)

app.use('/graphql', graphqlHTTP({
  schema: schemaWithMiddleware,
  rootValue: root,
  graphiql: true,
}))

最后,将 schemaWithMiddleware 导出到 API 的主入口中:

module.exports = {
  graphqlAPI: schemaWithMiddleware,
}

现在,您的 GraphQL API 已经使用哨兵保护了数据资源。

总结

在本文中,我们介绍了如何在 GraphQL 中使用哨兵来保护 API 的资源,以及如何设置哨兵的规则。要使用哨兵,请遵循以下步骤:

  1. 配置 GraphQL 服务
  2. 安装 GraphQL Shield
  3. 定义规则
  4. 将规则应用到 GraphQL

哨兵可以帮助您保护您的 GraphQL API,限制访问特定字段的能力,并确保敏感数据只能由授权用户访问。