gpt4 book ai didi

error-handling - GraphQL 编辑需要授权的字段的最佳实践

转载 作者:行者123 更新时间:2023-12-03 08:19:14 25 4
gpt4 key购买 nike

考虑 User类型,带有 email对于某些“匿名”用户,只有在请求得到适当授权的情况下才能访问该字段。其他用户可以公开显示他们的电子邮件。

type User {
name: String!
"Anonymous users have the email only accessible to admins"
email: String!
}

email 中处理该字段的这两种方法的优缺点是什么?匿名用户的解析器?
  • throw如果请求未经授权。在这种情况下,
  • email需要声明为可空 String而不是 String! , or the entire query will error .
  • 客户可能想匹配 the errors data .因为非匿名用户可以在未经授权的情况下访问他们的电子邮件,errorsdata可能有不同数量的元素,所以这个匹配似乎 不可能 ,至少对于 apollo-server,它不会在每个 errors 中返回任何内容指示哪个 user 的元素它属于。
  • email会误导null对于匿名用户,将这种情况与从未添加过的电子邮件混淆。请记住 email需要String ,而不是 String! ,所以一个 null电子邮件是合理的。
  • 有明确的errors响应中的数组,所以这感觉像是“正确”的方法?
  • 以编辑的形式返回电子邮件,例如 [NOT AUTHORIZED TO ACCESS THIS USER'S EMAIL] .
  • 这使对象保持完整,敏感电子邮件的错误明显,而不是误导“空”电子邮件。
  • email可以保持不可为空
  • 无需尝试匹配errorsdata .
  • 没有明确的 errors响应中的数组,所以这感觉就像一个黑客。

  • 请注意,对于数组,返回 REDACTED form 不是一个选项,因为查询可能会要求数组中的一个字段(例如 { anonUsers { email } } )。唯一的选择是返回 [] (直接或通过 throw ing)。

    我错过了什么吗?有没有关于这个主题的先前工作?我该如何做决定?

    最佳答案

    我最近做了类似的事情,似乎最有效的是为基本用户类型创建一个界面。

    interface UserInformation {
    id: ID!
    userName: String
    firstName: String!
    lastName: String
    avatarImage: String
    city: String
    ...
    }

    然后你会有两个单独的实现:
    type UserPublic implements UserInformation {
    id: ID!
    userName: String
    firstName: String!
    lastName: String
    avatarImage: String
    ...
    }
    type UserPrivate implements UserInformation {
    id: ID!
    userName: String
    firstName: String!
    lastName: String
    avatarImage: String
    friends: [UserInformation!]
    pendingFriends: [UserInformation!]
    phone: String
    email: String
    birthday: DateTime
    ...
    }

    所有其他查询和类型都使用 UserInformation公开用户时的基本接口(interface)类型。然后您的 graphql 服务器简单地返回 UserPublicUserPrivate取决于用户拥有什么类型的访问权限。

    在客户端,您可以像这样查询它:
    query SomeQuery {
    getSomeData {
    user {
    id
    userName
    firstName
    lastName
    avatarImage
    ...on UserPrivate {
    email
    phone
    }
    ...

    然后,您可以检查客户端返回的字段类型 ( __typename ) 是否为 UserPublicUserPrivate并采取相应行动。

    关于error-handling - GraphQL 编辑需要授权的字段的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61569702/

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