gpt4 book ai didi

GraphQL:如何限制跨查询的服务器端字段?

转载 作者:行者123 更新时间:2023-12-04 13:25:45 26 4
gpt4 key购买 nike

假设我有一个包含以下字段的用户类型:

type User {
name: String
username: String
someOtherField1: String
someOtherField2: String
someOtherField3: String
someOtherField4: String
creditCardNumber: String
}

如果我自己查询,返回所有字段也没关系,因为信息是我的。所以返回 creditCardNumber对客户来说没什么大不了的。但是如果我要查询其他人,我应该只能访问返回用户的公共(public)信息。返回 creditCardNumber会很糟糕。即使我没有在客户端上编写查询代码来执行此操作,如何防止恶意用户深入研究代码,更新客户端查询以包含 creditCardNumber ,并执行它?

在 GraphQL 中跨查询实现这种级别的字段限制的最佳方法是什么?到目前为止,我唯一的想法是创建一个单独的 UserSearch类型,即
type UserSearch {
name: String
username: String
someOtherField1: String
someOtherField2: String
someOtherField3: String
someOtherField4: String
}

其中不包括私有(private)字段,但是这不会让人感到干燥,因为您将创建许多在结构上彼此相似 90% 的类型。

有没有更简洁的方法来实现这一点,不会创建不必要的类型或重复字段?

最佳答案

默认情况下,GraphQL 类型可能是类型,这意味着您可以将 null 返回到任何字段。

这意味着,在 resolve您的creditCardNumber 的功能字段,您可以检查当前用户是否是正在获取的用户,如果是,则返回该号码。否则,您返回 null。

要访问“上下文”数据,例如当前用户,GraphQL 允许您传递一个对象 context执行 graphql 函数时:

graphql(schema, query, rootValue, context) // <-- the last parameter

您会在每个字段中找到此对象 resolve函数签名:
...
resolve: (object, args, context) => {
// Third argument is your object
},
....

所以你可以做的是在上下文中传递当前登录的用户:
graphql(schema, query, rootValue, { user: getCurrentLoggedUser() })

在您的 UsercreditCardNumber 内输入字段解析功能:
creditCardNumber: {
...
resolve: (user, args, context) => {
if (user.id === context.user.id)
return user.creditCardNumber;

return null;
},
...
}

如果您使用 graphql-express , 上下文默认是请求, and you can customize it .

关于GraphQL:如何限制跨查询的服务器端字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44641553/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com