Operation Registry
概要
GraphQL API の Demand Control
クライアントアプリケーションに必要な特定の操作を許可する
予期しない、あるいは高コストが予測される操作が実行されるリスクを低減する
使い方
スキーマの登録
クライアントバンドルの Operations の登録
クライアントバンドルはクライアント名で一意に識別される
JS, TS, .graphql ファイルをサポートしている
Apollo Client にランタイムに挿入される __typename フィールドをデフォルトでは含む
code:shell
$ npx apollo client:push \
--key <ENGINE_API_KEY> \
--clientName <CLIENT_IDENTIFIER> \
--includes="src/**/*.{ts,js,graphql}"
✔ Loading Apollo project
✔ Pushing client to Engine service <service>
サブスクリプションの無効化
Apollo Server 2.0 では subscription がデフォルトで有効になっているが、これは通常のリクエストパイプラインを利用していない別サーバーとして動作する。そのため、Operation Registry のプラグインはサブスクリプションにトリガーして動作することができず、サブスクリプションを介した操作を制限することができない。したがって、操作の safelisting を矯正したければ、サブスクリプションはオフにしておくべき。 Operation registry の Apollo Server への追加
apollo-server-plugin-operation-registry プラグインを Apollo Server に追加する。 code:shell
npm install apollo-server-plugin-operation-registry
code:js
const server = new ApolloServer({
// Existing configuration
typeDefs,
resolvers,
subscriptions: false,
// ...
// New configuration
plugins: [
require('apollo-server-plugin-operation-registry')({
forbidUnregisteredOperations: true,
}),
],
});
Apollo Engine と連携して Apollo Server を起動
Tips: 一時的な許可
ヘッダー情報から判別して一時的に禁止を解くことができるっぽい。