Установить cookie в заголовке ответа, но не установить в браузере - PullRequest
0 голосов
/ 24 ноября 2018

Я построил сервер GraphQL, используя apollo-server-express, и запустил его на локальном хосте: 4000.

Когда я передаю запрос с площадки GraphQL, в заголовке ответа есть set-cookie, как показано ниже: заголовок ответа

Но в хранилище> вкладка куки в chrome, куки нет. chrome: приложение> хранилище> куки

Вот мой server.ts.(Я думаю, что я установил мой cors конфиг правильно)

const server = new ApolloServer({
  typeDefs,
  resolvers,
  introspection: true,
  playground: true,
  dataSources: () => ({
    projectAPI: new ProjectAPI(),
  }),
  context: ({ req, res }: { req: Request; res: Response }) => ({ req, res }),
})

const app = express()

/* Parse cookie header and populate req.cookies */
app.use(cookieParser())

app.use(
  cors({
    origin: '*',
    credentials: true, // <-- REQUIRED backend setting
  })
)

app.use((req: any, res: any, next: any) => {
    console.log(req.cookies)
    next()
})

server.applyMiddleware({ app, path: '/' })

if (process.env.NODE_ENV !== 'test') {
  app.listen({ port: 4000 }, () =>
    console.log(`? Server ready at http://localhost:4000${server.graphqlPath}`)
  )
}

export { server }

А вот мой resolvers.ts:

export default {
  Query: {
    session: async (_: null | undefined, __: null | undefined, { res }: any) => {
      const response = await fetch(`http://localhost:3000/api/v1/sessions/current_user`, {
        headers: {
          'content-type': 'application/json',
        },
      })

      /** Get session cookie from the response header */
      const sessionCookie = setCookie
        .parse(response.headers.get('set-cookie') as string)
        .find((el: any) => el.name === '_session')

      /** If session cookie exists, save the cookie */
      if (sessionCookie && res) {
        const { name, value, ...rest } = sessionCookie
        res.cookie(name, value, rest)
      }

      const data = await response.json()
      return data.user
    },

1 Ответ

0 голосов
/ 01 декабря 2018

Используете ли вы apollo-client на стороне клиента?

Если это так, вам нужно добавить параметр credentials при создании завершающей http-ссылки (или пакетной ссылки и т. Д.).Если вы не используете apollo-client, вам просто нужно добавить эту опцию соответственно.

const OPTS = {
  uri: GQL_BASE,
  credentials: 'include', // or 'same-origin' etc.
  includeExtensions: true,
}

const httpLink = new BatchHttpLink(OPTS)

Вы правы, вам также необходимо добавить credentials: true в опциях CORS.

...