【问题标题】:Cookie set in Dev, but not in ProdCookie 设置在 Dev 中,但不在 Prod 中
【发布时间】:2019-03-01 11:24:41
【问题描述】:

我的 graphql/apollo 服务器有以下突变:

  async signup(parent, args, ctx, info) {
    args.email = args.email.toLowerCase();
    const password = await bcrypt.hash(args.password, 10);
    const user = await ctx.db.mutation.createUser(
      {
        data: {
          ...args,
          password,
          permissions: { set: ["USER"] }
        }
      },
      info
    );

    const token = jwt.sign({ userId: user.id }, process.env.APP_SECRET);

    ctx.response.cookie("token", token, {
      httpOnly: true,
      maxAge: 1000 * 60 * 60 * 24 * 365 // 1 year cookie
    });

    return user;
  },

在本地开发过程中,一旦有新用户注册,就会设置 cookie。这将有助于立即登录新用户。然而,一旦推送到 Now & Heroku,用户就会在数据库中创建,但 cookie 永远不会被设置。

我不确定从哪里开始调试,因为 prod 服务器上没有控制台输出。

请让我知道还有什么要添加的内容,我将进行编辑。

【问题讨论】:

  • 您在服务器的响应中看到Set-Cookie 标头吗?
  • 没有,一个是我刚刚注册新人的数据,另一个是{"data":{"me":null}}
  • 我也有类似的问题。这肯定是非常烦人的测试。你说cookie没有在响应中设置,对吧?您的 GraphQL API 是否在与您的应用程序不同的域上运行?也许你需要设置domain 选项。
  • @jkettmann 是的,数据库托管在 Heroku 上,Yoga 服务器运行在 Now.sh 上,前端再次运行在 Heroku 上。什么是域选项?如果您的意思是将 cors 的网址列入白名单,我已经这样做了。

标签: javascript database graphql apollo


【解决方案1】:

当我在与我的应用程序域不同的域或端口上托管 GraphQL API 时,我也遇到了这个问题。如果是这种情况,您需要在设置 cookie 时设置 domain 选项,如下所示:

ctx.response.cookie("token", token, {
  httpOnly: true,
  maxAge: 1000 * 60 * 60 * 24 * 365 // 1 year cookie
  domain: 'your-app-domain.com',
});

希望对你有帮助

【讨论】:

  • 根据 MDN 文档,它“指定将 cookie 发送到的主机。如果未指定,则默认为当前文档位置的主机部分。” cookie 是在瑜伽服务器上生成的,所以设置瑜伽服务器 url 会达到您的想法吗?我尝试了注册和登录突变,但没有成功。不过仍然在玩这个选项。
  • 对不起,你是对的。您应该使用应用程序的域,而不是服务器域。我更新了答案。
【解决方案2】:

这是为所有像我一样拥有金发碧眼的人。 在多个不同的浏览器中,有一个设置有效地阻止了 cookie 的设置。

调用 Chrome 设置

Block third-party cookies
Prevent third-party websites from saving and reading cookie data.

让我大吃一惊,我之前没有想到这一点,但这个设置阻止了我的应用程序运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2014-11-26
    • 1970-01-01
    • 2011-09-28
    • 2011-12-24
    相关资源
    最近更新 更多