Apollo Server Azure Functions 如何更改沙箱端点适配AAD鉴权
实现方案
Apollo Server 没有提供开箱即用的独立沙箱端点配置,但可以通过拆分Azure Functions路由+调整着陆页插件参数的方式实现需求,具体操作如下:
- 拆分两个独立的Function路由
- 新建匿名访问路由:例如路径设为
/graphql/sandbox,关闭该路由的AAD鉴权规则,允许所有未认证用户访问,这个路由仅用来返回嵌入的沙箱页面,不处理实际的GraphQL查询请求。 - 保留原有业务路由:例如路径设为
/graphql,保持原有AAD访问管控逻辑,所有未携带有效鉴权头的请求直接返回401,专门处理实际的GraphQL业务请求。
- 新建匿名访问路由:例如路径设为
- 调整沙箱路由对应的Apollo Server插件配置
给ApolloServerPluginLandingPageLocalDefault的embed参数传入详细配置,指定沙箱发起请求的目标为鉴权的业务路由,同时开启请求头编辑能力,方便用户填入AAD颁发的Bearer令牌,参考配置如下:
const sandboxServer = new ApolloServer({ schema, // 可复用原有schema,不影响逻辑 plugins: [ ApolloServerPluginLandingPageLocalDefault({ embed: { // 指定实际处理请求的鉴权GraphQL端点 endpoint: "https://<你的Function App域名>/graphql", // 沙箱默认展示请求头编辑区域 initialState: { headers: { Authorization: "Bearer <替换为你的AAD访问令牌>" } } } }) ] }); // 沙箱路由单独导出handler,配置对应CORS规则 export const sandboxHandler = sandboxServer.createHandler({ cors: { origin: "*", allowedHeaders: ["Content-Type", "Authorization"] } });
- 调整Function鉴权与CORS配置
在Azure Function配置中,将/graphql/sandbox路由的鉴权级别设为匿名,将/graphql路由绑定AAD鉴权规则;同时给/graphql路由配置CORS规则,允许沙箱所在域名的跨域请求(同域部署时可省略该步骤),确保带Authorization头的请求不会被拦截。
配置完成后,用户可直接匿名访问沙箱地址,打开沙箱后填入有效AAD令牌即可正常发起鉴权请求,不会出现沙箱静态资源被AAD拦截的问题。
内容的提问来源于stack exchange,提问作者joshft91
相关产品推荐
相关产品推荐

