我在后端使用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()});
}
}
服务器当前的设置方式如下:
cookie是这样设置的,
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”。
注意,控制台正在将“用户”记录为在服务器本身上未定义。
任何帮助将不胜感激。
最佳答案
我已经弄清楚出了什么问题,问题出在 cookie session 中。当 cookie 设置为 sameSite = 'none'
时,网络工具将拾取它并返回必须将 secure 设置为 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"
}
})
);
关于javascript - 尽管有凭据 : "include",但未发送 Cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68725629/