es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for 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.

Comments are closed.