Клиент Apollo запрашивает не отправлять заголовки на сервер, но мутации в порядке - PullRequest
0 голосов
/ 26 июня 2019

Я подключил интерфейс к графическому серверу. Большинство, если не все мутации защищены, тогда как все запросы не защищены. У меня есть система аутентификации, где, если вы входите в систему, вы получаете токен доступа / обновления, который требуется использовать для всех мутаций. И они делают это замечательно, бэкэнд получает заголовки и все!

ОДНАКО. Есть один запрос, которому нужен хотя бы токен доступа, чтобы отличить текущего пользователя! НО бэкэнд не получает два заголовка! Я думал, что middlewareLink, который я создал, будет для всех запросов / мутаций, но я ошибаюсь и не могу найти никаких дополнительных ресурсов, чтобы помочь мне.

Итак, вот мои настройки

Аполлон-client.js

import { InMemoryCache } from "apollo-cache-inmemory"
import { persistCache } from "apollo-cache-persist"
import { ApolloLink } from "apollo-link"
import { HttpLink } from "apollo-link-http"
import { onError } from "apollo-link-error"
import { setContext } from "apollo-link-context"

if (process.browser) {
  try {
    persistCache({
      cache,
      storage: window.localStorage
    })
  } catch (error) {
    console.error("Error restoring Apollo cache", error)
  }
}

const httpLink = new HttpLink({
  uri: process.env.GRAPHQL_URL || "http://localhost:4000/graphql"
})

const authMiddlewareLink = setContext(() => ({
  headers: {
    authorization: localStorage.getItem("apollo-token") || null,
    "x-refresh-token": localStorage.getItem("refresh-token") || null
  }
}))

const afterwareLink = new ApolloLink((operation, forward) =>
  forward(operation).map(response => {
    const context = operation.getContext()
    const {
      response: { headers }
    } = context

    if (headers) {
      const token = headers.get("authorization")
      const refreshToken = headers.get("x-refresh-token")

      if (token) {
        localStorage.setItem("apollo-token", token)
      }
      if (refreshToken) {
        localStorage.setItem("refresh-token", refreshToken)
      }
    }

    return response
  })
)

const errorLink = onError(({ graphQLErrors, networkError }) => {
  ...
  // really long error link code
  ...
})

let links = [errorLink, afterwareLink, httpLink]

if (process.browser) {
  links = [errorLink, afterwareLink, authMiddlewareLink, httpLink]
}

const link = ApolloLink.from(links)

export default function() {
  return {
    cache,
    defaultHttpLink: false,
    link
  }
}

Есть ли способ нацеливаться на ВСЕ мутации / запросы с помощью пользовательских заголовков, а не только мутаций? Или применить некоторые заголовки к отдельному запросу, поскольку я, вероятно, мог бы поместить это в качестве промежуточного программного обеспечения приложения?

edit: еще не решена часть этого, посвященная SSR .. будет повторно отредактирована с ответом, как только у меня будет.

...