身份验证

这是 GraphQL Library 7 版本的文档。对于长期支持 (LTS) 版本 5,请参考 GraphQL Library 5 LTS 版本

GraphQL 库提供了 @authentication 指令,用于为特定操作和模式的不同部分配置身份验证。

使用 @authentication 指令配置的显式身份验证仅在 Cypher 翻译阶段评估。需要身份验证的查询在未通过身份验证的情况下永远不会到达数据库。

操作

可以将身份验证配置为仅在特定操作上进行验证

  • CREATE

  • 读取 (READ)

  • AGGREGATE

  • UPDATE

  • DELETE

  • CREATE_RELATIONSHIP

  • DELETE_RELATIONSHIP

  • SUBSCRIBE

例如,只对用户的更新或删除操作要求身份验证

type User @authentication(operations: [UPDATE, DELETE]) @node {
    id: ID!
    name: String!
    password: String!
}

如果没有提供包含操作列表的 operations 参数,GraphQL 库会将身份验证配置视为已提供完整的操作列表。

范围

全局身份验证

身份验证可以应用于整个模式。这可确保对每个匹配的请求都进行身份验证检查。

扩展模式

extend schema @authentication

在指令应用于模式扩展时,也可以使用 operationsjwt 参数,例如

extend schema @authentication(operations: [UPDATE, DELETE], jwt: { roles_INCLUDES: "admin" })

类型的身份验证

可以为整个类型配置身份验证

type User @authentication @node {
    id: ID!
    name: String!
    password: String!
}

在此配置下,当尝试以下任意操作时都会进行身份验证验证

  • 创建: createUsers 变更,或通过关联类型的 create 嵌套操作。

  • 读取: usersusersConnectionaggregate 查询,或通过关联类型访问。

  • 更新: updateUsers 变更或通过关联类型的 update 嵌套操作。

  • 删除: deleteUsers 变更或通过关联类型的 delete 嵌套操作。

  • 创建关系: 通过关联类型的 connect 嵌套操作。

  • 删除关系: 通过关联类型的 disconnect 嵌套操作。

  • 订阅: 所有与类型 User 相关的订阅操作。

字段的身份验证

可以对每个字段单独配置身份验证,例如

type User @node {
    id: ID!
    name: String!
    password: String! @authentication
}

仅在以下情况下评估

  • password 字段在 createupdate 时被设置。

  • password 字段出现在选择集里。

额外验证

可以在身份验证的同时对 JWT 声明进行额外检查。例如,如果要求只有具有 admin 角色的用户才能删除用户。

type User @authentication(operations: [DELETE], jwt: { roles: { includes: "admin" }}) @node {
    id: ID!
    name: String!
    password: String!
}