无法将Apollo GraphQL Sandbox连接到本地GraphQL服务器
问题排查与解决方案
结合你的场景(GraphiQL可正常访问,但Apollo Sandbox无法连接/graphql端点),以下是具体排查方向和解决方法:
1. Devise Token Auth的认证拦截
你使用了devise_token_auth gem,该组件会要求请求携带access-token、client、uid等认证头,未认证的请求会被直接拦截。GraphiQL因为是在Rails页面内加载,可能已经通过登录流程获取了认证状态,但Apollo Sandbox作为独立客户端,默认不会携带这些头信息。
解决方法:
- 临时在GraphQL控制器中跳过认证测试:
# app/controllers/graphql_controller.rb class GraphqlController < ApplicationController # 根据你的devise_token_auth配置调整拦截器名称 skip_before_action :authenticate_user!, only: [:execute] def execute # 原有执行逻辑 end - 若需要保留认证,在Apollo Sandbox的「Headers」标签页添加认证头:从GraphiQL的请求头(浏览器开发者工具中查看)复制
access-token、client、uid三个字段的值填入。
2. Rails CSRF保护限制
Rails默认对POST请求会校验CSRF Token,GraphiQL页面加载时会自动携带X-CSRF-Token头,但Apollo Sandbox作为外部客户端没有该Token,导致请求被拒绝。
解决方法:
- 在GraphQL控制器中针对JSON请求跳过CSRF验证:
# app/controllers/graphql_controller.rb class GraphqlController < ApplicationController skip_before_action :verify_authenticity_token, if: -> { request.format.json? } def execute # 原有执行逻辑 end - 或者手动在Apollo Sandbox添加
X-CSRF-Token头:从浏览器开发者工具的Cookie中找到_csrf_token的值填入。
3. CORS配置细节遗漏
即使你确认CORS配置正确,可能存在覆盖不全的情况:
- 检查
config/initializers/cors.rb,确保包含以下配置:Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do origins '*' # 开发环境可临时用*,生产环境需指定具体域名 resource '*', headers: :any, methods: [:get, :post, :put, :patch, :delete, :options, :head], credentials: true # 必须开启,否则无法携带认证头或Cookie end end - 同时在Apollo Sandbox的「Settings」中开启「Include cookies」选项。
4. Apollo Sandbox请求协议/地址问题
- 确保输入的端点地址是
http://localhost:3000/graphql,而非https(本地Rails默认使用HTTP),Sandbox自动跳转HTTPS会导致跨协议连接失败。 - 临时禁用浏览器的广告拦截器、VPN等插件,排查是否有请求被拦截。
5. GraphQL端点路由约束
检查config/routes.rb中的路由配置,确保支持GET请求(Apollo Sandbox初始化时会发送GET请求做Schema introspection):
# 同时支持POST和GET请求 post "/graphql", to: "graphql#execute" get "/graphql", to: "graphql#execute"
内容的提问来源于stack exchange,提问作者Mighty
相关产品推荐
相关产品推荐

