Официальная версия Facebook гласит, что Relay «преднамеренно не зависит от механизмов аутентификации». Во всех примерах в репозитории Relay аутентификация и контроль доступа являются отдельной задачей. На практике я не нашел простого способа реализовать это разделение.
Все примеры, представленные в репозитории Relay, имеют корневые схемы с полем viewer
, которое предполагает наличие одного пользователя. И этот пользователь имеет доступ ко всему.
Однако на самом деле у приложения много пользователей, и каждый пользователь имеет разные степени доступа к каждому узлу.
Предположим, у меня есть эта схема в JavaScript:
export const Schema = new GraphQLSchema({
query: new GraphQLObjectType({
name: 'Query',
fields: () => ({
node: nodeField,
user: {
type: new GraphQLObjectType({
name: 'User',
args: {
// The `id` of the user being queried for
id: { type: new GraphQLNonNull(GraphQLID) },
// Identity the user who is querying
session: { type: new GraphQLInputObjectType({ ... }) },
},
resolve: (_, { id, session }) => {
// Given `session, get user with `id`
return data.getUser({ id, session });
}
fields: () => ({
name: {
type: GraphQLString,
resolve: user => {
// Does `session` have access to this user's
// name?
user.name
}
}
})
})
}
})
})
});
Некоторые пользователи являются полностью конфиденциальными с точки зрения запрашивающего пользователя. Другие пользователи могут открывать запрашивающему пользователю только определенные поля. Таким образом, чтобы получить пользователя, клиент должен не только предоставить идентификатор пользователя, который он запрашивает, но также должен идентифицировать себя, чтобы можно было осуществлять контроль доступа.
Кажется, что это быстро усложняется, поскольку необходимость управления доступом просачивается вниз по графу.
Кроме того, мне нужно контролировать доступ для каждого корневого запроса, например nodeField
. Мне нужно убедиться, что каждый узел, реализующий nodeInterface
.
Все это кажется повторяющейся работой. Существуют ли какие-либо известные шаблоны для упрощения этого? Я неправильно думаю об этом?