【问题标题】:I can't set the SameSite attribute of the cookie to None in Nodejs (Express)我无法在 Nodejs (Express) 中将 cookie 的 SameSite 属性设置为 None
【发布时间】:2020-12-20 04:05:05
【问题描述】:

我们正在 Nodejs (Express) 中为 Twitter 视图应用程序创建一个后端。

我正在考虑使用 Twitter Api 进行登录并将身份验证后返回的令牌存储到会话中,然后在再次访问时从 cookie 中恢复会话。

但是,再次访问时cookie被阻塞,无法恢复会话信息。

我使用的浏览器是chrome,但是从chrome 80版开始,在没有指定SameSite属性的情况下,SameSite属性似乎是Lax(从同域的站点调用时发送cookie),在这种情况下,前面和后端是不同的域,因此 cookie 被阻止。

所以我试图将 SameSite 属性设置为 None(当被任何站点调用时发送一个 cookie),但我似乎无法很好地设置它并问了这个问题。

我想知道如果我在 app.use(session({})) 的部分有所不同,是否可以将 SameSite 属性设置为 None,但是...

如果有人知道解决方案,我将不胜感激。

感谢您的帮助。

对应的源码

callback_url = env.URL + "oauth/callback";

app.use(
    cookieSession({
      name: "session",
      keys: ["thisappisawesome"],
      maxAge: 24 * 60 * 60 * 100
    })
);

app.use(cookieParser());

// Save to session
passport.serializeUser(function(user, done) {
    done(null, user.id);
});

// Restore from Session
passport.deserializeUser(function(user, done) {
    done(null, user);
});

passport.use(
    new TwitterStrategy({
        consumerKey: env.TWITTER_CONSUMER_KEY,
        consumerSecret: env.TWITTER_CONSUMER_SECRET,
        callbackURL: callback_url
    },
    async (token, tokenSecret, profile, done) => {

        return done(null, profile);
    }
));

app.use(session({
    allowedHeaders: ['sessionId', 'Content-Type'],
    exposedHeaders: ['sessionId'],
    secret: 'reply-analyzer',
    resave: false,
    saveUninitialized: false
}));

var cors_set = {
    origin: env.CORS_ORIGIN_URL,
    methods: "GET,HEAD,PUT,PATCH,POST,DELETE",
    credentials: true // allow session cookie from browser to pass through
};

app.use(passport.initialize());
app.use(passport.session());
app.use(cors(cors_set));

我尝试过的。

1.我尝试在 app.use(session({})) 部分设置 cookie 选项,但无法将 SameSite 属性设置为 None。

app.use(session({
    allowedHeaders: ['sessionId', 'Content-Type'],
    exposedHeaders: ['sessionId'],
    secret: 'reply-analyzer',
    resave: false,
    saveUninitialized: false,
    cookie : {
        secure: true,
        sameSite: 'None'
      }
}));

2.我尝试使用以下中间件 (express-samesite-default),但 SameSite 属性可以设置为 None,但不是。

var sameSiteCookieMiddleware = require("express-samesite-default");

app.use(sameSiteCookieMiddleware.sameSiteCookieMiddleware());

附加信息

Node.js v12.18.2 铬 v84.0.4147.135

【问题讨论】:

    标签: node.js express session cookies twitter


    【解决方案1】:

    我能够自行解决问题,并将描述我是如何解决问题的。 在代码中有两个会话和一个 cookie 会话,但我决定使用 cookie 会话,因为它似乎工作正常。 最终结果如下

    var cookieSession = require("cookie-session");
    app.set('trust proxy', 1)
    app.use(
        cookieSession({
          name: "__session",
          keys: ["key1"],
            maxAge: 24 * 60 * 60 * 100,
            secure: true,
            httpOnly: true,
            sameSite: 'none'
        })
    );
    

    【讨论】:

    • 但是默认情况下在隐身模式下不起作用:( stackoverflow.com/q/63171554/3948601
    • 你还在用这个作为解决方案吗?我和你有同样的原始问题
    • 这个答案对我有用。即使在隐身模式下,这也对我有用。非常感谢!!
    • 此答案中的修复可能仅在问题的原因是由于服务器和客户端之间存在单个代理时才有效。如果不是这种情况,请参阅this answer 了解另一个可能的原因/修复。 (这对我有用)
    【解决方案2】:

    我认为您的第一个解决方案应该很好。也可以尝试使用小写的“none”。

    【讨论】:

      【解决方案3】:

      尝试SameSite: 'none' 使用大写 S 它对我有用,但我使用了带有 cookie-parser 的 express-session ...我认为你的代码因为小 s 而不起作用,当我将我的代码更改为 sameSite 时,它​​对我也不起作用,但 SameSite 的工作方式与预期一样

      我也使用 npm i cors

      这是我的一段代码

      app.use(session({
          key: 'session_cookie_user_auth',
          secret: 'mooncore',
          store: sessionStore,
          resave: false,
          saveUninitialized: false,
          cookie: {
              SameSite: 'none',
              maxAge: 1000 * 60 * 60 * 60
          }
      }));
      

      【讨论】:

      • 但是您没有包含“secure: true”。是 2 一起造成了失败。
      猜你喜欢
      • 2019-12-18
      • 2021-01-11
      • 2020-05-01
      • 2020-04-18
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      • 2020-07-04
      • 2020-09-24
      相关资源
      最近更新 更多