亲爱的
我在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 })
});