SOCKET.IO:从开发工具访问 cookie。 Express-session
SOCKET.IO: Access cookies from devtools. Express-session
为什么我不能访问这个 cookie?
当用户登录时收到 cookie 并将其发送回 Express 服务器。
当向 Socket.io 服务器初始化一个新的 websocket 时,这个 cookie 没有被发送,所以我试图通过 document.cookie
获取它。但是,它不起作用,因为 cookie 不可修改。
这是一个 HttpOnly cookie,无法通过 client-side Javascript 访问。
换句话说:服务器 能够读取和操作 cookie。 客户端 接收它并盲目地将其随每个后续请求发回,无法读取或操作其内容,至少不能使用 Javascript 手段。
官方网站做了一些对我不起作用的事情。
express session middleware
const session = require("express-session");
io.use(wrap(session({ secret: "cats" })));
io.on("connection", (socket) => {
const session = socket.request.session;
});
所以,我通过以下方式解决了这个问题:
逻辑:
Before establishing websocket, request credentials to express endpoint "/userCredentials"
and then use these credentials to establish the connection
警告:下面的代码被删除了,因为我做了太多的授权逻辑
CLIENT:
...
useEffect(() => {
(async() => {
const pending_creds = await fetch("/userCredentials");
const creds = pending_creds.json();
const ws = io({auth: {creds}})
setSocket(ws)
})()
}, [])
...
SERVER:
...
app.get("/userCredentials", (req,res) => {
const userSession = req.session.user;
res.json(userSession)
})
...
io.use(socket, next){
const creds = socket.handshake.auth.userSession;
if(creds){
next()
} else {
socket.disconnect()
}
}
为什么我不能访问这个 cookie?
当用户登录时收到 cookie 并将其发送回 Express 服务器。
当向 Socket.io 服务器初始化一个新的 websocket 时,这个 cookie 没有被发送,所以我试图通过 document.cookie
获取它。但是,它不起作用,因为 cookie 不可修改。
这是一个 HttpOnly cookie,无法通过 client-side Javascript 访问。
换句话说:服务器 能够读取和操作 cookie。 客户端 接收它并盲目地将其随每个后续请求发回,无法读取或操作其内容,至少不能使用 Javascript 手段。
官方网站做了一些对我不起作用的事情。 express session middleware
const session = require("express-session");
io.use(wrap(session({ secret: "cats" })));
io.on("connection", (socket) => {
const session = socket.request.session;
});
所以,我通过以下方式解决了这个问题: 逻辑:
Before establishing websocket, request credentials to express endpoint "/userCredentials"
and then use these credentials to establish the connection
警告:下面的代码被删除了,因为我做了太多的授权逻辑
CLIENT:
...
useEffect(() => {
(async() => {
const pending_creds = await fetch("/userCredentials");
const creds = pending_creds.json();
const ws = io({auth: {creds}})
setSocket(ws)
})()
}, [])
...
SERVER:
...
app.get("/userCredentials", (req,res) => {
const userSession = req.session.user;
res.json(userSession)
})
...
io.use(socket, next){
const creds = socket.handshake.auth.userSession;
if(creds){
next()
} else {
socket.disconnect()
}
}