节点express-session反应:未将服务器cookie发送给客户端

时间:2019-01-03 15:32:54

标签: reactjs cookies https graphql express-session

亲爱的

我在React中创建的https客户端在调用服务器graphql变异时没有收到在服务器上创建的cookie(node.js应用程序,使用express-session)。

双方都是https,服务器在端口443 https://localhost:443上运行,客户端在端口3000 https://localhost:3000上运行

当我运行graphql游乐场端点(https://localhost:443/graphql)时,graphql工具会接收cookie。

但是当我使用apollo从客户端调用graphql突变时,客户端会接收数据,但不会接收cookie ...

因此,我假设问题与服务器和客户端之间的端口有关,但是我尝试了cookie参数“ sameSite”和“ secure”的所有配置。 无论这两个布尔值的组合如何,客户端都永远不会收到Cookie。

还有其他要设置的参数吗?

这是节点快速会话代码(会话存储在redis存储中)

谢谢。

app.use(cors({ origin: 'https://localhost:3000', credentials: true }));
app.use(session({
    store,
    name: SESSION_NAME,
    secret: SESSION_SECRET,
    resave: false,
    saveUninitialized: false,

    cookie: {
        maxAge: parseInt(SESSION_LIFETIME),
        sameSite: !IN_DEV,
        secure: !IN_DEV
    },
}));

[编辑-丹尼尔·雷登(Daniel Rearden)帮助后,问题已修复]

这是服务器端和客户端上的代码,可用来解决所有问题。

服务器端:

//  generation sessions
app.use(session({
    store,
    name: SESSION_NAME,
    secret: SESSION_SECRET,
    resave: false,
    saveUninitialized: false,

    cookie: {
        maxAge: parseInt(SESSION_LIFETIME),
        httpOnly: true,
        sameSite: true,
        secure: !IN_DEV,
    },
}));

app.use(cors({ origin: 'https://localhost:3000', credentials: true }));

// should be added to avoid CORS issue after executing the Grahql queries
res.setHeader("Access-Control-Allow-Origin", "https://localhost:3000");
const apolloServer = new ApolloServer({
    typeDefs,
    resolvers,

    //     //  permet de tester grqphql. 
    //     //  settings permet de gerer en dev les cookies
    playground: IN_DEV ? {
        settings: { 'request.credentials': 'include' }
    } : false,
    context: ({ req, res }) => ({ req, res })
});
apolloServer.applyMiddleware({ app });

客户端

import { ApolloClient } from 'apollo-client';
import { createHttpLink } from 'apollo-link-http'
import { InMemoryCache } from 'apollo-cache-inmemory'
const link = createHttpLink({
    uri: "https://localhost/graphql",
    credentials: 'include'
});

export const apolloClient = new ApolloClient({
    link,
    cache: new InMemoryCache({ addTypename: false })
});

0 个答案:

没有答案