Nella mia app express node.js, ho integrato l'autenticazione di Facebook usando passport.js. Posso aprire la pagina di accesso di Facebook in una finestra popup, quindi l'accesso avviene. A questo punto, il reindirizzamento avviene nella finestra popup. Ma ho bisogno di chiudere la finestra popup e di effettuare il reindirizzamento nella finestra genitore (, ad esempio, la finestra padre reindirizzerà). Inserirò il codice completo qui anche se penso che il problema principale sia nel file modello (.ejs).passport.js, dopo l'autenticazione nella finestra pop-up, chiudilo e reindirizza la finestra genitore
E non sono riuscito a trovare alcuna soluzione nelle domande simili là fuori in SO.
// Passport session setup.
passport.serializeUser(function(user, done) {
done(null, user);
});
passport.deserializeUser(function(obj, done) {
done(null, obj);
});
// Use the FacebookStrategy within Passport.
passport.use(new FacebookStrategy({
clientID: config.facebook_api_key,
clientSecret:config.facebook_api_secret ,
callbackURL: config.callback_url
},
function(accessToken, refreshToken, profile, done) {
console.log(" id = "+profile.id);
process.nextTick(function() {
//Check whether the User exists or not using profile.id
//Further DB code.
profile.user_id="00000444000555";
return done(null, profile);
});
}
));
app.set('views', __dirname + '/views');
app.set('view engine', 'ejs');
//app.set('view engine', 'jade');
app.use(cookieParser());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(session({ secret: 'keyboard cat', key: 'sid'}));
app.use(passport.initialize());
app.use(passport.session());
app.use(express.static(__dirname + '/public'));
//Router code
app.get('/', function(req, res){
res.render('index', { user: req.user });
});
app.get('/account', ensureAuthenticated, function(req, res){
console.log(req.user);
res.render('account', { user: req.user });
});
//Passport Router
app.get('/auth/facebook', passport.authenticate('facebook'));
app.get('/auth/facebook/callback',
passport.authenticate('facebook', {
successRedirect : '/',
failureRedirect: '/login'
}),
function(req, res) {
res.redirect('/');
});
app.get('/logout', function(req, res){
req.logout();
res.redirect('/');
});
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) { return next(); }
res.redirect('/login')
}
app.listen(8000);
E il file di modello è:
<script type="text/javascript">
if (window.location.hash && window.location.hash == '#_=_') {
if (window.history && history.pushState) {
window.history.pushState("", document.title, window.location.pathname);
} else {
// Prevent scrolling by storing the page's current scroll offset
var scroll = {
top: document.body.scrollTop,
left: document.body.scrollLeft
};
window.location.hash = '';
// Restore the scroll offset, should be flicker free
document.body.scrollTop = scroll.top;
document.body.scrollLeft = scroll.left;
}
}
</script>
<% if (!user) { %>
<div style="width:500px;height:180px;">
<h2 style="font-size:40px;">Welcome! Please log in.</h2>
<a href="javascript:void(0)" onclick=" window.open('/auth/facebook','',' scrollbars=yes,menubar=no,width=500, resizable=yes,toolbar=no,location=no,status=no')"><img src="fb-login.jpg" width="151" height="24"></a>
</div>
<% } else { %>
<script type="text/javascript">
window.parent.location.href ="/";
window.close();
</script>
<h2>Hello, <%= user.displayName %>.</h2>
<% } %>
Forse questo aiuta? http://www.webdeveasy.com/single-page-application-authentication/ Non è lo stesso stack, ma potresti essere in grado di prendere in prestito la loro idea – kane
@kane praticamente, ma stanno usando angolare per inviare indietro msg a finestra genitore ... im ora mi chiedo come posso fare questo senza angolare ... sembra di aprire un socket e inviare un messaggio a me stesso può funzionare, ma sembra eccessivo # –