2017-06-02 5 views
0

UPDATE: Es ist erwähnenswert, dass meine Website über einen iFrame geladen wird.Safari speichert keine Cookies, aber Chrome ist

Hier ist meine cookieSession in meinem app.js:

app.use(cookieParser()); 

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

ich dann versuchen, den Benutzer zu setzen, und Token bei der Anmeldung

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'); 
    }); 

}); 

Das in Chrome funktioniert, aber es funktioniert nicht. Arbeit in Safari.

Ich habe den Safari-Speicher über die Webkonsole überprüft und unter meiner Domain wird nichts gespeichert.

Jeder Grund, warum es nicht funktioniert?

+0

Mögliche Duplikat [Einstellung Cross-Domain-Cookies in Safari] (https://stackoverflow.com/questions/408582/setting-cross-domain-cookies-in-safari) – styfle

Antwort

0

Wenn Ihre Seite in einen Iframe geladen wird, kann der Endbenutzer Third Party Cookies blockieren, wodurch Ihre Website daran gehindert wird, den Cookie zu schreiben.

Siehe Safari Privacy Settings. Weitere Informationen

Haben Sie versucht zu sehen, ob der Cookie funktioniert hat, als die Seite direkt besucht wurde, anstatt eines iFrames?

+0

Ja habe ich direkt versucht und es funktioniert gut. Das Problem ist, dass ich einen iframe verwenden muss. Ich entwickle eine App für das Shopfy Embedded SDK und sie müssen es in einem Iframe haben. –

+0

Haben Sie versucht, Ihre Datenschutzeinstellungen zu ändern, um Cookies von Drittanbietern zuzulassen und zu prüfen, ob das funktioniert? – styfle

+0

Ja, ich habe es versucht und es scheint zu funktionieren. Ich finde es nur ein Hindernis für die Benutzer, dies zu tun. Leider bin ich von Shopify aufgefordert, einen iFrame zu benutzen, um meine Seite zu zeigen, wie Sie [hier] sehen können (https://help.shopify.com/api/sdks/shopify-apps/embedded-app-sdk) –

1

Es sieht so aus, als ob Sie hier einen Safari Bug treffen (https://bugs.webkit.org/show_bug.cgi?id=3512); Sie leiten einen beliebigen besuchten Browser zum/Dashboard um, während Sie gleichzeitig den Cookie setzen, und Safari ignoriert den Set-Cookie-Header, wenn der HTTP-Status 302 (oder 301 I thing so) auftritt. In diesem Fall müssen Sie halten user token in einer Variablen und setzen Sie es auf /dashboard Controller dann überprüfen und speichern user token in req.session.

  • Aktualisiert: Sende deine Token (genereted von login Controller) an dashboard Controller

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

Ist das nicht ein Sicherheitsfehler, wenn 'User-A' sich'/login' anmeldet und 'User-B' während der Weiterleitung' 'dashboard' 'besucht? Die globale Variable wird demjenigen zugewiesen, der zuerst die Seite besucht, nachdem sich jemand eingeloggt hat. In diesem Fall wird "Benutzer-B" die Sitzung "Benutzer-A" haben. – styfle

+0

'User-A' hat eine Token-Zeichenfolge' tokenA' und wird umgeleitet auf 'res.redirect ('/ dashboard? Token = tokenA');' imboard-Controller können Sie alle Informationen von 'User-A' abrufen – hoangdv

+0

@styfle Ich habe meine Antwort aktualisiert – hoangdv

Verwandte Themen