graphql - Apollo Sandbox introspection'ı aç diyor ama introspection zaten açık | Apollo server + TypeScript


Bir süredir Apollo server kullanıyorum ve bununla birçok proje geliştirdim, ancak son zamanlarda bunu TypeScript ile birlikte kullanmak istedim, birçok denemeden sonra sonunda çalıştırmayı başardım, ama Apollo Sandbox ile takıldım, şöyle diyor:

Şema İçgörüleme Başarısızlığı: Bu uç noktada içgörüleme devre dışı bırakılmış. Şemanızı doldurmak için içgörülemeyi etkinleştirin.

Sorun şu ki zaten denetimi açık durumdayım, işte referansınız için sunucu yapılandırmam:

// Imports...

const protection = new ApolloArmor({
  // Some configs...
}).protect();

const server: ApolloServer = new ApolloServer({
  schema,
  // ...protection,
  debug: config.env.development,  // Currently "true"
  introspection: config.env.development,  // Currently "true"
  csrfPrevention: true,
  cache: "bounded",
  cors: {
    origin: [...config.globals.whiteListedIps],  // Currently "*"
  },
  plugins: [
    config.env.production  // Currently "false"
      ? ApolloServerPluginLandingPageProductionDefault()
      : ApolloServerPluginLandingPageLocalDefault({ embed: true }),
    ApolloServerPluginInlineTraceDisabled(),
  ],
  context: async ({ req }: { req: CustomRequest }) => {
    // some stuff...
  },
  dataSources: () => {
    // some stuff....
  },
  // Other configs...
});

export default server;

Ben kullanıyorum:

  • Node JS - v16.15.0
  • TypeScript - v4.8.3
  • ts-node-dev - v2.0.0
  • graphql - v16.6.0
  • apollo-server - v3.10.2
  • @apollo/subgraph - v2.1.2

Umarım bana yardımcı olabilirsin, şimdiden teşekkürler

Cevap #1

Peki, belki API’niz korunuyor. Gitip herhangi bir tarayıcının ağ denetleme sekmesinde kontrol edebilirsiniz ve hata gösterilecektir. "context" kullandınız, bunun yetkilendirme ile ilgili olduğunu düşünüyorum ve context kısmını kaldırırsanız muhtemelen düzgün çalışacaktır (context'i kaldırmak çözüm değil, ama hatanızın arkasındaki en muhtemel sebep bu olacaktır).

Cevap #2

Bunun nedeni introspection'ın da bir GraphQL sorgu isteği olmasıdır, context içindeki tüm istekler için kimlik doğrulama yapmalı ve verilerin çözülmesini engellemelisiniz.

İçgörü sorgusunu hariç tutmak için:

context: async ({ req, res }) => {

      // Make sure you are not exposing it in prod.
      if (
        req.body?.operationName === "IntrospectionQuery" &&
        process.env.NODE_ENV !== "production"
      ) {
        return;
      }

      // Rest of your authentication.
}

UYARI: Üretim veya güvensiz ortamlarda yapılması tavsiye edilmez. Sadece geliştirme amacıyla yapın.