[英]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.