2017-06-02 68 views
0

更新:值得一提的是,我的网站正在通过iframe加载。Safari不会保存cookie,但Chrome是

这是我在我的app.js cookieSession:

app.use(cookieParser()); 

app.use(cookieSession({ 
    secret: "SECRET_SIGNING_KEY", 
    maxAge: 15724800000 
})); 

然后我尝试设置用户和令牌在登录时

app.post('/login', function(req, res){ 

    Parse.User.logIn(req.body.username, req.body.password).then(function(user) { 
     req.session.user = user; 
     req.session.token = user.getSessionToken(); 
     res.redirect('/dashboard'); 
    }, function(error) { 
     console.log(error) 
     req.session = null; 
     res.render('login'); 
    }); 

}); 

这个工作在Chrome,但事实并非如此。在Safari上工作。

我已经通过Web控制台检查了Safari存储并且在我的域下没有任何被保存。

任何它不工作的原因?

+0

[在Safari中设置跨域饼干]的可能的复制(HTTPS:/ /stackoverflow.com/questions/408582/setting-cross-domain-cookies-in-safari) – styfle

回答

0

如果您的页面被加载到iframe中,最终用户可能会选择阻止Third Party Cookies,这会阻止您的网站写入cookie。

请参阅Safari Privacy Settings。获取更多信息

当您直接访问该页面而不是iframe时,您是否试图查看Cookie是否有效?

+0

是的,我直接尝试,它工作正常。问题是我需要使用iframe。我正在为Shopify Embedded SDK构建一个应用程序,并且他们需要将它放在iframe中。 –

+0

您是否尝试更改隐私设置以允许第三方Cookie并查看该功能是否有效? – styfle

+0

是的,我试过了,它似乎工作。我发现这是用户这样做的一个障碍。不幸的是,我需要Shopify使用iFrame来显示我的网站,因为您可以看到[这里](https://help.shopify.com/api/sdks/shopify-apps/embedded-app-sdk) –

1

它看起来像你在这里遇到一个Safari错误(https://bugs.webkit.org/show_bug.cgi?id=3512); 您在同时设置cookie的同时将任何访问浏览器重定向到/仪表板,并且Safari在遇到302(或301 I事情)HTTP状态时忽略Set-Cookie标头。 在这种情况下,您需要将user token保存在一个变量中,然后将其存入/dashboard控制器,然后重新检查并将user token存储在req.session中。

  • 更新时间:发表您的令牌(由login控制器genereted)到dashboard控制器

app.post('/login', function(req, res) { 
 
    Parse.User.logIn(req.body.username, req.body.password).then(function(user) { 
 
     res.redirect('/dashboard?token=' + user.getSessionToken() + '&user=' + user); 
 
    }, function(error) { 
 
     console.log(error) 
 
     req.session = null; 
 
     res.render('login'); 
 
    }); 
 

 
}); 
 

 

 
app.post('/dashboard', function(req, res) { 
 
    if (req.query.user && req.query.token) { 
 
     // save for first time 
 
     req.session.user = req.query.user; 
 
     req.session.token = req.query.user; 
 
    } 
 
    // check token in session before go 
 

 
});

+0

如果'User-A'访问'/ login'并且被重定向,'User-B'恰好访问'/ dashboard',这不会是一个安全漏洞吗?全局变量将分配给谁在用户登录后首先访问页面的人。在这种情况下,User-B将具有User-A的会话。 – styfle

+0

'User-A'有一个令牌字符串'tokenA',并且重定向到'res.redirect('/ dashboard?token = tokenA');'在dasboard控制器中,你可以获得'User-A'的所有信息 – hoangdv

+0

@styfle我已经更新了我的答案 – hoangdv

相关问题