¿Cuál es un buen patrón para implementar el control de acceso en un servidor GraphQL?

Fondo:

Tengo un conjunto de modelos, incluido un usuario y varios otros modelos, algunos de los cuales contienen referencias a un usuario. Estoy exponiendo estos modelos para realizar consultas a través de una API GraphQL generada por Graffiti , respaldada por una base de datos Mongo usando el adaptador graffiti-mongoose . Mi API de REST actual (que estoy migrando a GraphQL) usa los tokens web de JSON para autenticar a los usuarios, y tiene alguna lógica de permiso personalizada en el lado del servidor para manejar el control de acceso.

Problema:

Me gustaría restringir el acceso a los objetos en GraphQL en función del usuario que haya iniciado sesión actualmente. Algunos modelos deben ser accesibles para lecturas por llamadas no autenticadas. La mayoría de los otros modelos solo deben ser accesibles para el usuario que los creó. ¿Cuál es la mejor manera de administrar el control de acceso a los objetos a través de la API generada por Graffiti?

En general, ¿hay buenos patrones de control de acceso para GraphQL? Y, en particular, ¿existen buenos ejemplos o bibliotecas para hacerlo con Graffiti?

Notas:

Entiendo que se han implementado ganchos anteriores y posteriores para graffiti-mongoose, y que se pueden usar para hacer verificaciones binarias básicas de autenticación. Me gustaría ver cómo podría trabajarse una lógica de control de acceso más detallada en una API GraphQL. En el futuro, querremos admitir cosas como los Administradores que tienen acceso a instancias de modelos creadas por un determinado grupo de Usuarios (por ejemplo, Usuarios cuyas Afiliaciones incluyen la del Administrador).

Normalmente, GraphQL no maneja el control de acceso directamente, en lugar de delegar esa responsabilidad a cualquier sistema de datos con el que interactúa. En su caso, eso suena a Mangosta.

Dado que la lógica de control de acceso es a menudo una lógica arbitraria (por ejemplo, ¿se ha excluido a este usuario de algún contenido? ¿El editor de ese contenido lo restringió con configuraciones de privacidad personalizadas? de hecho, debe vivir en la función “resolver” que produce un valor para un campo GraphQL.

Por ejemplo:

var UserType = new GraphQLObjectType({ name: 'User', fields: { name: { type: GraphQLString }, birthday: { type: GraphQLString, resolve(user, context) { var auth = context.myLoggedInAuth; if (myCanAuthSeeBirthday(auth, user)) { return user.birthday; } } } } }); 

Creo un control de acceso de base de reglas para usar con GraphQL.

https://github.com/joonhocho/graphql-rule

Es simple y no opcionado que se puede usar con o sin GraphQL.

Puedes usarlo con un simple objeto javascript.

Espero que ayude a GraphQLers!