iba*_*ban 5 twitter cookies session node.js express
我们正在为 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));
Run Code Online (Sandbox Code Playgroud)
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'
}
}));
Run Code Online (Sandbox Code Playgroud)
2.我尝试使用以下中间件(express-samesite-default),但是可以将 SameSite 属性设置为 None ,而事实并非如此。
var sameSiteCookieMiddleware = require("express-samesite-default");
app.use(sameSiteCookieMiddleware.sameSiteCookieMiddleware());
Run Code Online (Sandbox Code Playgroud)
Node.js v12.18.2 铬 v84.0.4147.135
我能够自我解决,并将描述我如何解决该问题。在代码中有两个会话和一个 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'
})
);
Run Code Online (Sandbox Code Playgroud)