Javascript Express会话不适用于Firebase主机
当我有以下内容时,会话被持久化,页面统计访问次数Javascript Express会话不适用于Firebase主机,javascript,firebase,express,firebase-hosting,Javascript,Firebase,Express,Firebase Hosting,当我有以下内容时,会话被持久化,页面统计访问次数 app.set('trust proxy', true) // The documentation specifies '1' instead of 'true' app.use(session({ secret: 'my secret', proxy: true, resave: false, saveUninitialized: true, cookie: { secure: false } })) app.
app.set('trust proxy', true)
// The documentation specifies '1' instead of 'true'
app.use(session({
secret: 'my secret',
proxy: true,
resave: false,
saveUninitialized: true,
cookie: { secure: false }
}))
app.listen(3000, function(){
console.log("Server is connected!");
});
app.get("/login", (req, res) => {
if(req.session.page_views){
req.session.page_views++;
res.send("You visited this page " + req.session.page_views + " times");
} else {
req.session.page_views = 1;
res.send("Welcome to this page for the first time!");
}
});
但是,当我删除app.listen(3000,…)
并通过CLI中的firebase service
命令在localhost
中运行时,会话不会持久化
我还尝试通过firebase deploy
在生产环境中运行,但会话并没有持久化
我在app.use(session)({
上尝试了多个选项,我相信解决方案可能就在那里
有什么建议吗
更新
const express = require('express');
const session = require('express-session');
const FirestoreStore = require('firestore-store')(session);
const bodyParser = require('body-parser');
app.use(cookieParser('My secret'));
app.use(bodyParser.urlencoded({ extended: true }));
app.use(session({
store: new FirestoreStore({
database: firebase.firestore()
}),
secret: 'My secret',
resave: true,
saveUninitialized: true,
cookie: {maxAge : 60000,
secure: false,
httpOnly: false }
}));
如果您使用的是firebase主机,您还可以使用一个连接器将您的express会话与firebase连接起来 您可以尝试将firebase数据库存储与当前express会话集成的中间件。这可能会解决您关于会话持久性的问题 更新:
如果您正在使用firebase主机和云功能,则只能设置名为
\u session
的cookie。您可能必须使用此名称在firebase主机中持久化会话
app.use(session({
store: new FirestoreStore({
database: firebase.firestore()
}),
name: '__session',
secret: 'My secret',
resave: true,
saveUninitialized: true,
cookie: {maxAge : 60000,
secure: false,
httpOnly: false }
}));
有关更多信息:
- 我会建议一些东西,而不是使用这个,我会建议你使用这个
我注意到您正在使用Express,因此您可能需要检查以下用法:
快车
注意:在Express 4中,必须将Express会话传递给函数connect session firebase exports,以便扩展Express-session.Store:
const express = require('express');
const session = require('express-session');
const FirebaseStore = require('connect-session-firebase')(session);
const firebase = require('firebase-admin');
const ref = firebase.initializeApp({
credential: firebase.credential.cert('path/to/serviceAccountCredentials.json'),
databaseURL: 'https://databaseName.firebaseio.com'
});
express()
.use(session({
store: new FirebaseStore({
database: ref.database()
}),
secret: 'keyboard cat'
resave: true,
saveUninitialized: true
}));
,您可能还需要真正考虑依赖关系
提供的<强>安全> /强>。 如果您使用公开可用的Firebase数据库,请设置适当的 规则:您可以阅读更多信息,我也使用过它。它确实缺少存储。我现在可以看到会话保存在Firebase数据库中,但每次我刷新页面时都会创建一个新会话。看来浏览器无法匹配cookie并创建一个新会话。如何解决此问题?@rgoncalv在上打开一个错误请求github,并将其链接到您的答案。我之前使用过它,它正在将会话保存到实时数据库。但问题相同。不过,在这两种情况下,我都没有将凭据或数据库URL放在
initializeApp()
中,因为我总是使用我需要的一切(存储、Firestore)只需调用initializeApp()
,就可以使用Admin SDK。我只是试着这样做,但我下载了json文件,但它似乎无法识别。应该如何格式化路径/to
呢?你能试着制作一个示例代码(简单到计算页面浏览量),看看它是否可以工作吗?
{
"rules": {
".read": "false",
".write": "false",
"sessions": {
".read": "false",
".write": "false"
},
"some_public_data": {
".read": "true",
".write": "auth !== null"
}
}
}