Официальная линия от Facebook заключается в том, что Relay "намеренно не зависит от механизмов аутентификации." Во всех примерах репозитория Relay особое внимание уделяется проверке подлинности и контролю доступа. На практике я не нашел простого способа реализовать это разделение.
В примерах, предоставленных в репозитории ретрансляции, есть корневые схемы с полем viewer
, предполагающим наличие одного пользователя. И у этого пользователя есть доступ ко всему.
Однако на самом деле приложение имеет много пользователей, и каждый пользователь имеет разные степени доступа к каждому node.
Предположим, что у меня есть эта схема в 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
. Мне нужно убедиться, что каждый node реализующий nodeInterface
.
Все это кажется много повторяющейся работой. Существуют ли какие-либо известные шаблоны для упрощения этого? Я думаю об этом неправильно?