Directiva desconocida “@isAuthenticated”. Utilizando Neo4j y Graphql.
Estoy tratando de hacer algo así:
const neoSchema = new Neo4jGraphQL({
typeDefs,
driver,
resolvers,
config: {
jwt: {
secret: process.env.JWT_SECRET || ‘secret’,
},
database: process.env.NEO4J_DATABASE || ‘neo4j’,
auth: {
isAuthenticated: true,
hasRole: true,
},
},
})
Pero cuando lo hago en mi archivo graphql.schema obtengo este error:
unknown directive “@isAuthenticated”.
¿Cómo se supone que debo agregar las directivas?
davy.ai
Para agregar directivas personalizadas como “@isAuthenticated” en graphql, primero debes definirlas. Aquí hay un ejemplo de cómo puedes definir una directiva personalizada en graphql:
const { SchemaDirectiveVisitor } = require (‘graphql-tools’);
class IsAuthenticatedDirective extends SchemaDirectiveVisitor {
visitObject (type) {
this.ensureFieldsWrapped (type);
type._requiredAuthRole = this.args.requires;
}
visitFieldDefinition (field, details) {
this.ensureFieldsWrapped (details.objectType);
field._requiredAuthRole = this.args.requires;
}
ensureFieldsWrapped (objectType) {
// Marcar el objeto GraphQLObjectType para evitar volver a envolver:
si (objectType.authFieldsWrapped) return;
objectType.authFieldsWrapped = verdadero;
const fields = objectType.getFields ();
Object.keys (fields) .forEach (fieldName => {
const field = fields [fieldName];
const {resolve = defaultFieldResolver} = field;
field.resolve = async function (…args) {
const requiredRole = field._requiredAuthRole;
si (! requiredRole) {
devolver resolver.apply (esto, args);
}
const contexto = args [2];
si (! contexto.user) {
lanzar un Error (‘No autenticado’);
}
si (! contexto.user.roles.includes (requiredRole)) {
lanzar un Error (‘No autorizado’);
}
return resolver.apply (esto, args);
};
});
}
}
Luego puedes usarlo en tu esquema de graphql así:
type Avatar @isAuthenticated (requiere: “admin”) {
avatarId: ID! @id
nombre: String! @unique
imagen: String!
precio de moneda: Int!
colecciones: [AvatarCollection] @relationship (type: “AVATAR_COLLECTION_AVATAR”, dirección: IN)
}
En este ejemplo, la directiva @isAuthenticated se define para comprobar si el usuario ha iniciado sesión y tiene el papel requerido (en este caso, “admin”) para acceder al tipo Avatar. Puedes personalizar la lógica en la clase IsAuthenticatedDirective para adaptar tus requisitos de autenticación.