Cookie在生产NextJS getServerSideProps中未定义



我正在使用云功能使用自定义服务器托管我的nextjs网站。

const { https, logger } = require("firebase-functions");
const { default: next } = require("next");
const nextjsDistDir = require("../next.config.js").distDir;
const isDev = process.env.NODE_ENV !== "production";
const nextjsServer = next({
dev: isDev,
conf: {
distDir: nextjsDistDir,
},
});
const nextjsHandle = nextjsServer.getRequestHandler();
//The `nextApp` here is the Firebase Cloud Functions name
exports.nextApp = https.onRequest((req, res) => {
return nextjsServer.prepare().then(() => {
logger.info(req.path, req.query);
return nextjsHandle(req, res);
});
});

我有一个AuthProvider,它应该监视身份验证状态的变化,并设置一个包含身份验证令牌的cookie

import nookies from 'nookies';
import firebase from "firebase/app";
import firebaseClient from "../scripts/firebaseClient";
import "firebase/auth";
import Cookies from 'js-cookie';
const AuthContext = createContext({});
export function AuthProvider({ children }) {
firebaseClient();
const [user, setUser] = useState(null);
// handle auth logic here...
// listen for token changes
// call setUser and write new token as a cookie
useEffect(() => {
return firebase.auth().onIdTokenChanged(async (user) => {
nookies.destroy(null, "token");
if (!user) {
setUser(null);
console.log("no user")
nookies.destroy(null, "token");
//nookies.set(undefined, 'token', '', { path: '/' });
document.cookie = `token=''; path=/`;
// Cookies.set("token", "");
return;
} else {
const token = await user.getIdToken();
setUser(user);
console.log("auth state token : "+token);
nookies.destroy(null, "token");
//console.log("auth user : "+token)
//nookies.set(undefined, 'token', token, { path: '/' });
// Cookies.set("token", token);
document.cookie = `token=${token}; path=/`;


return;
}
});
}, []);
//
// force refresh the token every 10 minutes
useEffect(() => {
const handle = setInterval(async () => {
const user = firebase.auth().currentUser;
if (user) await user.getIdToken(true);
}, 10 * 60 * 1000);
// clean up setInterval
return () => clearInterval(handle);
}, []);
return (
<AuthContext.Provider value={{ user }}>{children}</AuthContext.Provider>
);
};
export const useAuth = () => useContext(AuthContext);

然后,我应该在getServerSideProps中的页面中获取cookie,并检查cookie中包含的令牌是否有效。饼干在生产中唯一出现的是undefined。cookie"token"在开发模式下可见。关于这个问题的所有其他问题都与生产中的cookie没有问题。我可能做错了什么。正如你从上面的代码中看到的,我已经尝试使用各种cookie包来设置cookie,如nookiesnext-cookiescookies等,它们都在开发模式下工作,而不是在生产中工作

https://firebase.google.com/docs/hosting/functions#using_cookies

当将Firebase Hosting与Cloud Functions或Cloud Run一起使用时,cookie通常会从传入请求中剥离。这对于实现高效的CDN缓存行为是必要的。只有特别命名的__session cookie才允许传递到应用程序的执行。

如果存在,__session cookie会自动成为缓存密钥的一部分,这意味着拥有不同cookie的两个用户不可能接收到对方的缓存响应。如果您的应用程序根据用户授权提供不同的内容,则仅使用__session cookie。

换句话说,似乎存储id令牌的cookie的键值应该被更改为"_会话";

Cookies.set("__session", token);

它在本地运行良好,但当我部署它时,出现了一个问题。请以这种方式修复并尝试

祝你好运。

最新更新