You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Neo4j GraphQL使用@isAuthenticated指令报未知指令错误如何解决

错误原因

Neo4j GraphQL的权限校验指令(包括@isAuthenticated、@hasRole等)不是默认注册到Schema中的,你只开启了配置项中的auth开关,但没有引入对应指令的定义,所以GraphQL解析Schema时会识别不到该指令。

修复步骤

1. 引入内置指令定义

你可以选择两种方式完成指令注册:

  • 方式一:从@neo4j/graphql包中导入官方提供的授权指令声明
// 2.x及更早版本导入方式
import { Neo4jGraphQL, authDirectiveTypeDefs } from '@neo4j/graphql'

// 3.x及以上版本授权重构为插件,导入方式调整为
import { Neo4jGraphQL } from '@neo4j/graphql'
import { Neo4jGraphQLAuthorization, authDirectiveTypeDefs } from '@neo4j/graphql/authorization'
import { Neo4jGraphQLAuthJWKSPlugin } from '@neo4j/graphql-plugin-auth'
  • 方式二:直接在你的graphql.schema文件顶部手动添加指令声明,无需修改JS代码
directive @isAuthenticated on OBJECT | FIELD_DEFINITION
directive @hasRole(roles: [String!]!) on OBJECT | FIELD_DEFINITION

2. 调整初始化配置(仅使用方式一需要修改)

在初始化Neo4jGraphQL实例时,将官方的授权指令定义和你的业务类型定义合并传入:

2.x及更早版本示例

const neoSchema = new Neo4jGraphQL({
  // 合并指令定义和业务typeDefs
  typeDefs: [authDirectiveTypeDefs, typeDefs],
  driver,
  resolvers,
  config: {
    jwt: {
      secret: process.env.JWT_SECRET || 'secret',
    },
    database: process.env.NEO4J_DATABASE || 'neo4j',
    auth: {
      isAuthenticated: true,
      hasRole: true,
    },
  },
})

3.x及以上版本示例

const authorizationPlugin = new Neo4jGraphQLAuthorization({
  isAuthenticated: true,
  hasRole: true,
  plugins: [
    new Neo4jGraphQLAuthJWKSPlugin({
      // 对称签名可替换为secret配置
      secret: process.env.JWT_SECRET || 'secret'
    })
  ]
})

const neoSchema = new Neo4jGraphQL({
  typeDefs: [authDirectiveTypeDefs, typeDefs],
  driver,
  resolvers,
  plugins: {
    authorization: authorizationPlugin
  }
})

3. 验证使用

修改后重启服务,@isAuthenticated指令即可正常生效:添加在类型上时,所有针对该类型的查询/变更操作都要求请求头携带有效JWT令牌,格式为Authorization: Bearer <JWT内容>。

内容的提问来源于stack exchange,提问作者Jimmy Soussan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:24:07