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
相关产品推荐
相关产品推荐

