📅  最后修改于: 2023-12-03 15:08:37.528000             🧑  作者: Mango
GraphQL 是一种用于 API 的查询语言,它的特点是可以让开发者指定需要的数据,这样可以减少无用数据的传输,提升 API 的响应速度。其中一个重要的安全策略就是使用哨兵来保护 API 的资源。
在本文中,我们将介绍如何在 GraphQL 中使用哨兵来保护 API 的资源,以及如何设置哨兵的规则。
GraphQL 哨兵是一种用于控制图形化数据的安全策略,主要用于保护 API 的访问资源,通过定义规则限制请求,以保证 GraphQL API 的安全性。
要在 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,
}))
接下来,安装 GraphQL Shield,这是一个用于保护 GraphQL API 的库。
npm install graphql-shield
定义规则是使用哨兵的最后一步。要定义规则,您需要首先定义一个逻辑函数来判断用户是否有权访问特定的字段。
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,
},
})
现在已经定义了规则,可以将它们应用到 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 的资源,以及如何设置哨兵的规则。要使用哨兵,请遵循以下步骤:
哨兵可以帮助您保护您的 GraphQL API,限制访问特定字段的能力,并确保敏感数据只能由授权用户访问。