出于安全策略,生产GraphQL关闭了Introspection,结果PWA构建阶段的codegen报错,无法下载schema。把生产重新开放并不是唯一办法;前端构建本就不该依赖生产站实时可用。

把Schema变成版本化构建产物

在受控的集成或预生产环境启用Introspection,环境安装与生产相同的Magento模块和版本。由CI生成schema文件,经审查后随前端代码版本化:

npx graphql-codegen --config codegen.yml
sha256sum schema.graphql
git diff -- schema.graphql

codegen.yml的数据源改为本地schema.graphql,生产构建只读该文件,不访问生产GraphQL。不要把管理Token写进配置或构建日志。

如何保证Schema没有过期

  1. 后端合并请求部署到集成环境;
  2. CI重新拉取schema并与仓库版本比较;
  3. 有差异就要求后端提交schema更新;
  4. 前端执行类型生成、查询校验和契约测试;
  5. 后端与前端产物按兼容版本一起发布。

自定义模块字段缺失

确认集成环境启用了相同模块:

bin/magento module:status Vendor_Module
bin/magento setup:upgrade
bin/magento cache:clean config graphql

Resolver类存在但schema文件未合并时,检查模块的etc/schema.graphqls路径、语法和模块加载顺序。用最小查询直接验证字段,而不只是看codegen。

关闭Introspection不是完整的GraphQL防护

仍需查询复杂度或深度限制、速率限制、认证、CORS和错误信息脱敏。对外公开的商品查询通常可被客户端观察到,不能把关闭Introspection当作访问控制。

上线验收:用生产禁用Introspection的真实配置构建一次前端,运行核心购物车与结账查询;再故意删除一个字段,确认CI会在发布前失败。