我正在使用zeit来制作一个带有react的同构应用程序和一个带有express-session(在其他服务器中)的express用于制作API。
此组件应该从API请求私有数据(request.get('http://0.0.0.0:3100/private'))并在用户登录时显示私人页面,否则重定向到登录。
在客户端这可行,但是当我刷新私有页面时,我被重定向到登录,因为客户端和服务器端的会话cookie是不同的。 ¿我该如何解决这个问题?
%=
答案 0 :(得分:2)
@PacoRampus as @neerajdngl说在刷新页面时,你的cookie被传递到快速服务器而不是浏览器。所以,您被重定向到登录页面。
您可以这样做:
app.UseStaticFiles();
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
并且您的server.js文件应该是这样的代码:
Private.getInitialProps = async ({ req, res }) => {
let Cookie;
if (req) {
Cookie = encodeURIComponent(req.cookies.your_token_name);
} else {
Cookie = '';
}
let yourCookie= 'token=' + Cookie;
const response = await fetch('http://someDomain/private', {
credentials: 'include',
headers: {Cookie: yourCookie}
}));
let body;
if (response.status !== 401) {
body = await response.json();
} else {
if (res) {
res.writeHead(302, { Location: '/login' })
res.end()
} else {
Router.push('/login')
}
}
return {}
}
希望这适合你。
答案 1 :(得分:1)
当您刷新页面时,cookie将被传递到快速服务器,而不是api。您需要在快递中获取cookie,然后将cookie与api请求一起传递。
当您从客户端发出api请求时,cookie将自动与请求一起传递,该请求将验证您的api呼叫。
您需要执行以下代码段中的操作。我正在使用 fetch 而不是 request
getCookies = encodeURIComponent(req.cookies.token);
const sendCookie = 'token=' + getCookies;
const response = await fetch(YOUR_API_ENDPOINT, {
credentials: 'include',
headers: {Cookie: sendCookie}
})