Facebook の公式見解は、Relay は「意図的に認証メカニズムにとらわれない」というものです。Relay リポジトリのすべての例では、認証とアクセス制御は別の問題です。実際には、この分離を実装する簡単な方法は見つかりませんでした。
viewer
Relay リポジトリで提供されている例にはすべて、ユーザーが 1 人であることを前提としたフィールドを持つルート スキーマがあります。そして、そのユーザーはすべてにアクセスできます。
ただし、実際には、アプリケーションには多くのユーザーがいて、各ユーザーは各ノードへのアクセス レベルが異なります。
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
}
}
})
})
}
})
})
});
一部のユーザーは、クエリを実行するユーザーの観点から完全に非公開です。他のユーザーは、特定のフィールドのみを照会ユーザーに公開する場合があります。そのため、ユーザーを取得するには、クライアントはクエリ対象のユーザー ID を提供するだけでなく、アクセス制御が行われるように自分自身を識別する必要もあります。
これは、アクセスを制御する必要性がグラフを少しずつ下るにつれて、すぐに複雑になるようです。
さらに、ルート クエリごとにアクセスを制御する必要がありますnodeField
。すべてのノードが を実装していることを確認する必要がありますnodeInterface
。
これらはすべて、多くの反復作業のように思えます。これを単純化するための既知のパターンはありますか? 私はこれについて間違って考えていますか?