【问题标题】:How can Appsync request headers by passed to a child resolver?Appsync 如何将请求标头传递给子解析器?
【发布时间】:2021-03-21 16:02:54
【问题描述】:

我有一个 Appsync 架构,它定义了一个用户类型,它本身包含一个注释列表:

type User {
  id: ID!
  name: String!
  notes: [Note]
}

type Note {
  id: ID!
  text: String!
}

User 的请求映射中,我可以访问请求的标头,以访问承载令牌:

{
    "version": "2018-05-29",
    "method": "GET",
    "resourcePath": $util.toJson("/prod/user/$ctx.args.userId"),
    "params":{
        "headers":{
            "Content-Type": "application/json",
            "Authorization": "Bearer $ctx.request.headers.Authorization",
        }
    }
}

这很好用,并且标头被传递到数据源。

User.notes 字段的解析器是一个 Lambda 解析器,它本身迭代地调用类似的 API GET /prod/user/{userId}/notes/{noteId}。我可以使用$ctx.source... 访问父解析器响应数据。但是,我还需要能够通过 Authorization 标头(例如$ctx.request.headers.Authorization)。

我已经在User 响应映射中尝试过这个,但它不起作用:

#set($results = $ctx.result.body)
#set($headers = {
        "Authorization": "Bearer $ctx.request.headers.Authorization"
    })
#set($results.headers = $headers)
$results

我的问题是,如何将请求标头从父解析器传递给子解析器? 也许另一种提问方式是,鉴于我在 Graphql 请求标头上有一个 Bearer 令牌,我如何确保它始终传递给任何被调用的解析器?

【问题讨论】:

  • 听起来像一个愚蠢的问题,但只是为了排除这种可能性,您是否在您的子解析器中尝试过ctx.request.headers.Authorizationt?因为results 字段只对响应映射模板可用。
  • 我确实尝试过,但不幸的是,ctx.request 在调用子解析器之前被清空。作为测试,我将整个$ctx 注入到 lambda 函数中,这样我就可以将其注销,并且其中没有包含标题的任何内容。这让我觉得我需要对父解析器做一些事情来缓存标题?但我不知道这是否可能
  • 我相信这可以通过 Pipeline resolver 轻松解决。

标签: graphql http-headers aws-api-gateway aws-appsync


【解决方案1】:

正如@Myz 在他们的评论中提到的,解决方案是使用管道解析器。

最后,我将标头推入 $ctx.stash 对象(管道解析器中的所有函数都可以使用该对象) - 我这样做是使用:

$util.qr($ctx.stash.put("bearerToken", "Bearer $ctx.request.headers.Authorization"))

然后我可以使用以下方法在每个函数(即子解析器)中访问此值:"$ctx.stash.bearerToken"

【讨论】:

    【解决方案2】:

    添加注释user_id

    type Note {
      id: ID!
      user_id: ID!
      text: String!
    }
    

    并解析注释:[Note] by $ctx.source.id 在 postgres 这个应用程序

    {
        "version": "2018-05-29",
        "statements": [
            "select * from notes where user_id = '$ctx.source.id'"
        ]
    }
    

    其中 $ctx.source.id 链接到用户 -> id

    【讨论】:

      猜你喜欢
      • 2018-09-21
      • 2019-03-01
      • 2021-01-07
      • 2018-12-20
      • 2016-04-21
      • 2017-06-01
      • 2013-11-23
      • 2022-11-28
      • 1970-01-01
      相关资源
      最近更新 更多