在响应头中使用apollo,cookie,但未设置

时间:2018-10-27 14:16:39

标签: reactjs cookies graphql apollo express-session

我正在开发用户登录/注册功能,这是一个较大项目的一部分,并且正在localhost(Apollo服务器并响应apollo前端)上工作。我正在使用快速会话。

提交登录名时,我可以看到响应头中包含set-cookie,但未在Application-> Cookies中设置。

我尝试了不同的浏览器,使用createHttpLink,apollo-boost并使用include&same-origin(使用same-origin)。

我一直在尝试使它工作2星期,并且已经没有足够的尝试了,这是我的最后选择!我知道它确实很琐碎,但我看不到。

如果我使用GraphqL Playground并更改设置以包括凭据,则可以看到其中设置了cookie。

服务器在localhost:8080 / graphql上运行 客户端在localhost:3000上运行

客户:

const client = new ApolloClient({
    link: new HttpLink({
        uri: 'http://localhost:8080/graphql',
        credentials: 'same-origin',
    }),
    cache: new InMemoryCache()
});

Cors:

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

Express-Session:

app.use(
    session({
        name: "sess",
        secret: process.env.SESSION_SECRET,
        resave: false,
        saveUninitialized: false,
        cookie: {
            httpOnly: true,
            secure: false,
            maxAge: 1000 * 60 * 60 * 24 * 7,
        },
    })
);

响应Cookie:

HTTP/1.1 200 OK
X-Powered-By: Express
Access-Control-Allow-Origin: *
Vary: Origin
Access-Control-Allow-Credentials: true
Content-Type: application/json
Content-Length: 69
set-cookie: sess=s%3AAZXnGb5BVc1aAOwH6zBNiT8mB6Ebf75k.in%2BPU1OvxymDPdPIZBf8%2FQzrRmM0S04tXFzXDwYCnk8; Path=/; Expires=Sat, 03 Nov 2018 13:59:57 GMT; HttpOnly
Date: Sat, 27 Oct 2018 13:59:57 GMT
Connection: keep-alive

4 个答案:

答案 0 :(得分:1)

我遇到了同样的问题。如果您在 2 年后仍在寻找答案,请将客户端中的凭据设置为“包含”,如下所示:

const client = new ApolloClient({
  uri: 'http://localhost:4000/graphql',
  cache: new InMemoryCache(),
  credentials: 'include'
});

答案 1 :(得分:0)

问题似乎是CORS配置之一。首先,将HttpLink更改为使用credentials: 'include';然后尝试以下CORS中间件:

app.use(
  cors({ 
    origin: 'http://localhost:3000',
    credentials: true,
    allowedHeaders: ['Content-Type', 'Authorization'],
  })
);

如果仍然出现错误The value of the 'Access-Control-Allow-Origin' header in the response must not be the wildcard '*' when the request's credentials mode is 'include'.,则表明CORS中间件未正确设置Access-Control-Allow-Origin: http://localhost:3000(您的示例显示它正在返回*,但我不确定是否是一个复制/粘贴问题,因为cors模块文档建议这样做应该可以。)

答案 2 :(得分:0)

我设法通过将CORS设置直接传递给applyMiddleware来解决此问题。

答案 3 :(得分:0)

我尝试使用express修复它。但这不适用于Apollo GraphQL。

const corsOptions = {
    origin: "http://localhost:3000",
    credentials: true
  };
app.use(cors(corsOptions));

因此,我尝试在GraphQL服务器中配置cors并成功运行。

对于Apollo服务器

const corsOptions = {
    origin: "http://localhost:3000",
    credentials: true
  };

const server = new ApolloServer({
  typeDefs,
  resolvers,
  cors: corsOptions
});

server.listen().then(({ url }) => {
  console.log(` Server ready at ${url}`);
});

对于GraphQL Yoga

const options = {
  cors: corsOptions
};

server.start(options, () =>
  console.log("Server is running on http://localhost:4000")
);