尽管凭据未发送 Cookie:"include"
Cookies not being sent despite credentials: "include"
我在后端使用 express,在前端使用 react。我正在使用 cors 从 passport.js GoogleOAuth 获取用户详细信息。我正在使用 Heroku 在两个不同的域中托管前端和后端。客户端中的请求如下所示:
fetchAuthUser = async () => {
const metadata = {
headers : {
'Content-Type': 'application/json',
'Accept': 'application/json'
},
referrerPolicy: "strict-origin-when-cross-origin",
body: null,
method: "GET",
mode: "cors",
credentials: "include"
}
const response = await fetch(Env.backend_host +'/authenticate_google/api/current_user', metadata).catch((err) => {
console.log(err)
});
console.log(response);
if (response && response.data) {
this.setState({user: eval(response.data)}, () => {this.loadPages()});
}
}
目前服务器设置如下:
cookies是这样设置的,
router.use(
cookieSession({
maxAge: 30 * 24 * 60 * 60 * 1000, // sets cookie to expire in 30 days (converted to milliseconds)
keys: ["trialkey"],
sameSite: "lax",
})
);
获取响应如下
router.get("/api/current_user", cors({ origin: "https://energycast-front.herokuapp.com", methods: ['GET','POST','OPTIONS'], credentials: true, preflightContinue: true}), (req, res) => {
console.log("User:" +req.user)
res.json(req.user);
});
问题似乎与 cors 无关,但是在观察请求时,我发现没有发送任何 cookie。这很奇怪,因为我设置了凭据“include”。
注意,控制台正在记录服务器本身未定义的“用户”。
我们将不胜感激。
如果请求来自不同的站点并且不是由顶级导航(而是通过 fetch
语句)发起的,则带有 SameSite=Lax
的 Cookie 将被阻止。
尝试使用 sameSite: "None"
。
该 cookie 也可能被阻止,因为它违反了您浏览器中的第三方 cookie 设置。
我已经弄清楚出了什么问题,问题出在 cookie-session 上。当 cookie 设置为 sameSite = 'none'
时,网络工具将拾取它并且 return 必须将安全错误设置为 true。但是,在将 secure 设置为 true 后,网络调试工具恢复为说 samesite 设置为“Lax”并且无法发送 cookie。
因此我已经切换到 express-cookie 包:
router.set('trust proxy', 1) // trust first proxy
router.use(
session({
secret: SECRET,
resave: false,
saveUninitialized: true,
cookie: {
secure: true,
sameSite: "none"
}
})
);
我在后端使用 express,在前端使用 react。我正在使用 cors 从 passport.js GoogleOAuth 获取用户详细信息。我正在使用 Heroku 在两个不同的域中托管前端和后端。客户端中的请求如下所示:
fetchAuthUser = async () => {
const metadata = {
headers : {
'Content-Type': 'application/json',
'Accept': 'application/json'
},
referrerPolicy: "strict-origin-when-cross-origin",
body: null,
method: "GET",
mode: "cors",
credentials: "include"
}
const response = await fetch(Env.backend_host +'/authenticate_google/api/current_user', metadata).catch((err) => {
console.log(err)
});
console.log(response);
if (response && response.data) {
this.setState({user: eval(response.data)}, () => {this.loadPages()});
}
}
目前服务器设置如下:
cookies是这样设置的,
router.use(
cookieSession({
maxAge: 30 * 24 * 60 * 60 * 1000, // sets cookie to expire in 30 days (converted to milliseconds)
keys: ["trialkey"],
sameSite: "lax",
})
);
获取响应如下
router.get("/api/current_user", cors({ origin: "https://energycast-front.herokuapp.com", methods: ['GET','POST','OPTIONS'], credentials: true, preflightContinue: true}), (req, res) => {
console.log("User:" +req.user)
res.json(req.user);
});
问题似乎与 cors 无关,但是在观察请求时,我发现没有发送任何 cookie。这很奇怪,因为我设置了凭据“include”。
注意,控制台正在记录服务器本身未定义的“用户”。
我们将不胜感激。
如果请求来自不同的站点并且不是由顶级导航(而是通过 fetch
语句)发起的,则带有 SameSite=Lax
的 Cookie 将被阻止。
尝试使用 sameSite: "None"
。
该 cookie 也可能被阻止,因为它违反了您浏览器中的第三方 cookie 设置。
我已经弄清楚出了什么问题,问题出在 cookie-session 上。当 cookie 设置为 sameSite = 'none'
时,网络工具将拾取它并且 return 必须将安全错误设置为 true。但是,在将 secure 设置为 true 后,网络调试工具恢复为说 samesite 设置为“Lax”并且无法发送 cookie。
因此我已经切换到 express-cookie 包:
router.set('trust proxy', 1) // trust first proxy
router.use(
session({
secret: SECRET,
resave: false,
saveUninitialized: true,
cookie: {
secure: true,
sameSite: "none"
}
})
);