Skip to content

Deprecate GraphQL Playground that exposes master key in HTTP response #10110

@mtrezza

Description

@mtrezza

Problem

The GraphQL Playground endpoint (mountPlayground: true) embeds the master key as a plaintext string literal in the HTML response:

'X-Parse-Master-Key': ${JSON.stringify(this.parseServer.config.masterKey)},

Anyone who can reach the /playground URL gets the master key — no authentication required. While documented as a dev-only feature, this is a fundamentally problematic pattern: an unauthenticated HTTP endpoint that serves the most privileged credential in cleartext HTML.

Context

The built-in playground was introduced when GraphQL was newer and standalone tools were less mature (~2019-2020). Shipping a built-in explorer with pre-configured credentials lowered the onboarding barrier. The landscape has since changed — standalone GraphQL tools are now mature, widely available, and free. The only value the server-side playground still adds over them is auto-configured credentials, which is exactly the part that's problematic.

Parse Dashboard already ships its own GraphQL console (embedded GraphiQL) with proper authentication and does not use the Parse Server /playground endpoint. Removing the playground has zero impact on Parse Dashboard.

Proposal

Deprecate and remove the GraphQL Playground feature.

Recommended alternatives:

  • Parse Dashboard — provides an integrated GraphQL explorer with proper authentication
  • Third-party clients (Apollo Sandbox, GraphiQL, Insomnia, Postman) — developers can configure their own headers locally, which is a conscious choice rather than a server-side exposure

The key distinction: a developer pasting their master key into a local tool's header config is fundamentally different from the server broadcasting it over HTTP to anyone who requests a URL.

Steps

  1. Mark mountPlayground and playgroundPath options as deprecated
  2. Log a deprecation warning when enabled
  3. Remove in the next major version

Metadata

Metadata

Assignees

No one assigned

    Labels

    state:breakingBreaking change requires major version increment and `BREAKING CHANGE` commit messagestate:releasedReleased as stable versionstate:released-alphaReleased as alpha versiontype:featureNew feature or improvement of existing feature

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions