保护子图
使用密钥限制对云超级图的访问
为了保持你的超级图安全,确保你的各个子图只被你的路由器查询是很重要的。这是因为你的子图暴露了强大的字段,而路由器正是使用这些字段在不同的子图之间执行操作。外部客户端不应该访问这些字段。
本文描述了在使用云超级图时保护你的子图的步骤。
💡 提示
和所有变更一样,我们建议首先对你的超图的非生产版本执行这些步骤。
步骤 1. 生成共享密钥
为了将子图通信限制为仅通过你的路由器,我们建议为每个子图创建一个单独的共享密钥。每次你的路由器查询子图时,都会将其相应的密钥包括在一个 HTTP 头中。
你可以使用各种工具生成随机密钥。例如,大多数密码管理器都提供这种功能。
以下是一些生成适合随机密钥的shell命令,如果你安装了相应的工具:
openssl rand -base64 256
python -c "import secrets; print(secrets.token_urlsafe(256))"
node -e "console.log(require('crypto').randomBytes(256).toString('base64'));"
步骤 2. 将密钥添加到你的路由器配置
您的云超级图's 路由器需要知道共享密钥,以便它在向相应的子图的所有请求中包含它。您可以在Cloud Routing部分中的您的图变体的设置页面添加密钥。
💡 提示
有关详细信息,请参阅:管理密钥。
在定义密钥后,您可以将其值作为环境变量注入到路由器的配置中,如下所示。我们建议将值设置在名为Router-Authorization
(再次强调,为每个子图创建单独的密钥)的头部中:
headers:subgraphs:products:request:- insert:name: 'Router-Authorization'value: '${env.PRODUCTS_SUBGRAPH_SECRET}'users:request:- insert:name: 'Router-Authorization'value: '${env.USERS_SUBGRAPH_SECRET}'
步骤 3. 配置子图以要求密钥
在您的子图中强制要求共享密钥的确切步骤取决于:
- 您的子图使用的语言和框架
- 您使用的子图托管服务
大多数云服务提供商都包含一个机制来保存密钥,然后将其作为环境变量提供给您的应用程序。您的子图应从环境变量中读取密钥并拒绝包含指定头部中密钥的任何传入请求。
步骤 4. 测试配置
在将共享密钥添加到您的路由器和子图后,执行以下操作以确认通信已按预期安全:
- 通过从探索器向路由器执行测试查询,验证您的路由器是否仍然可以与子图通信。
- 确保查询中至少包含相关子图中的一个字段!
- 通过直接对子图执行测试查询,验证其他客户端无法与子图通信。
- 此查询应因授权错误而失败。