簡體   English   中英

跳過特定 GraphQL 查詢的身份驗證

[英]Skip authentication on a specific GraphQL query

我有一個客戶端應用程序正在使用的 GraphQL API(TypeScript、Express、apollo-server)。 所有請求都需要通過驗證 JWT 令牌來進行身份驗證,如下所示:

  return new ApolloServer({
    schema,
    plugins: [ApolloServerPluginDrainHttpServer({ httpServer })],
    context: async ({ req }) => {
      const user = await validateJWT(ctx, req)
      return { ...ctx, user }
    },
  })

(忽略ctx ,這是一個特定於實現的細節。)

我的問題是我需要允許特定查詢未經身份驗證。 在入職期間,客戶端甚至在創建用戶之前就獲取數據。

type Query {
  onboardingData(profile: ProfileInput!): OnboardingData!
  ...
}

繞過特定查詢的身份驗證的適當方法是什么?

我研究過使用

import { parse, print } from 'graphql'

req.body.query獲取查詢,然后進行字符串匹配,但至少可以這么說。 我的蜘蛛俠感覺很刺痛,它容易出錯、混亂和潛在的漏洞。

在 REST 世界中,我只會指定要排除的特定路徑。

您可以獲取上下文以返回獲取用戶的函數,而不是將用戶獲取到上下文級別並將其返回給解析器。 將您的上下文主體包裝在一個函數中並返回該函數。 然后在需要身份驗證和/或當前用戶的解析器上,您只需調用它,類似於您在上下文正文中調用它的方式。

例子:

const user = await validateJWT()

或者更好的命名:

const user = await getCurrentUser()

這種方法使您可以靈活地僅在需要身份驗證的解析器上調用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM