gatsby-source-graphql, похоже, не передает заголовок cookie, как решить? - PullRequest
0 голосов
/ 01 ноября 2019

Как передать заголовки Cookie из gatsby-source-graphql?

Я использую gatsby-source-graphql (https://github.com/gatsbyjs/gatsby/tree/master/packages/gatsby-source-graphql), и недавно мне пришлось использовать AWS Cloudfront Signed Cookies для авторизации пользователей. чтобы получить доступ к частной промежуточной среде, по этой причине запросы к конечной точке graphql, обрабатываемые плагином, должны иметь cookie-файл в заголовке запроса, который я делаю следующим образом:

{
  resolve: 'gatsby-source-graphql',
  options: {
    cookie: 'var1=val1; var2=val2; '
  }
}

Выше не удается,

ServerParseError: Unexpected token < in JSON at position 0

Если отключить подписанные файлы cookie и сделать конечную точку общедоступной, это сработает.

И, если я снова оставлю это в секрете и протестирую с помощью curl, будет работать:

curl --cookie 'var1=val1; var2=val2; ' graphql_endpoint.com

Я попытался выяснить, почему заголовок Cookie не пропущен, но кажется, что проблема в другом плагине, который используется в плагине выше, называется 'apollo-link-http' (https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-source-graphql/src/gatsby-node.js)

Между тем,просматривая ссылку apollo-http-link (https://www.apollographql.com/docs/link/links/http/) и сообщаемую здесь проблему (https://github.com/apollographql/apollo-client/issues/4455),), я пытался:

{
  resolve: 'gatsby-source-graphql',
  options: {
    typeName: 'FOOBAR',
    fieldName: 'foobar',
    createLink: (pluginOptions) => {
        return createHttpLink({
          uri: process.env.GATSBY_GRAPHQL_API_URL,
          credentials: 'include',
          headers: {
            cookie: "CloudFront-Policy=xxxxx_; CloudFront-Key-Pair-Id=xxxxx; CloudFront-Signature=xxxxxxxxxx; path=/;",
          },
          fetch,
        })
    },
  }
},

Без успеха, та же ошибка, что и раньше.

Также пытался использовать параметры извлечения дляr node-fetch,

{
  resolve: 'gatsby-source-graphql',
  options: {
    typeName: 'FOOBAR',
    fieldName: 'foobar',
    url: process.env.GATSBY_GRAPHQL_API_URL,
    fetchOptions: {
        credentials: 'include',
        headers: {
            cookie: "CloudFront-Policy=xxxxx_; CloudFront-Key-Pair-Id=xxxxx; CloudFront-Signature=xxxxxxxxxx; path=/;",
        },
    },
  }
},

Как вы видите fetchOptions здесь (https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-source-graphql/src/gatsby-node.js)

Нет успеха! Это, вероятно, ошибка.

1 Ответ

1 голос
/ 01 ноября 2019

Потратив много времени на просмотр документов и других отчетов, я нашел решение, основанное на попытках, которые я первоначально разместил.

Я начал с просмотра версии браузера и проверки файлов cookie. Имя свойства заголовка, чтобы избежать опечаток. Я определил, что это должно быть «Cookie», так как большинство найденных примеров упоминают «.cookie» и т. Д.

enter image description here

С учетом сказанного,Я проверил документацию по всем связанным пакетам и исходному коду:

https://github.com/gatsbyjs/gatsby/tree/master/packages/gatsby-source-graphql
https://github.com/gatsbyjs/gatsby/blob/master/packages/gatsby-source-graphql/src/gatsby-node.js

https://www.apollographql.com/docs/link/links/http/
https://github.com/apollographql/apollo-client/issues/4455

Наконец, я объявил параметр cookie заголовков и в отдельном свойстве параметры для пакета извлечения узла:

https://github.com/bitinn/node-fetch

Результат:

{
  resolve: 'gatsby-source-graphql',
  options: {
    typeName: 'FOOBAR',
    fieldName: 'foobar',
    url: process.env.GATSBY_GRAPHQL_API_URL,
    headers: {
        Cookie: 'CloudFront-Policy=xxxxx_; CloudFront-Key-Pair-Id=xxxxx; CloudFront-Signature=xxxxxxxxxx; path=/;'
    },
    credentials: 'include',
  }
},

Что происходит выше, так это то, что «учетные данные включают» разрешают межбраузерные запросы на отправку и включают файлы cookie (https://www.apollographql.com/docs/react/networking/authentication/#cookie)

Надеюсь, чтоэто поможет кому-то еще в будущем, поскольку это не тривиально.

...