护照 - nodejs - 在 facebook 身份验证后将用户返回到上一页
passport - nodejs - returning user to previous page after facebook auth
我是 passport 的新手,我正在尝试将用户重定向到他们在使用 facebook 进行身份验证后之前所在的页面。我正在尝试在会话中设置 "req.session.returnTo" 属性,但它在 facebook/auth 回调中不断消失(该函数中的所有地方都显示为未定义)。我的方法有什么问题?
受保护的路线:
app.post('/api/recipebox', ensureAuthenticated, function (req, res) {
});
确保已验证:
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
return next();
}
req.session.returnTo = req.path;
res.redirect('/#!/login');
}
//Facebook/Passport.js 回调:
app.get('/auth/facebook/callback', function (req, res, next) {
passport.authenticate('facebook', function (err, user, redirectURL) {
// console.log(' in the callback ');
if (err) {
console.log(err);
return res.redirect('/#!/login');
}
if (!user) {
return res.redirect('/#!/signup');
}
if (req.user) {
// console.log("==================== This is the user from routes.js", req.user);
res.cookie('user', JSON.stringify(user));
}
//actually storing the fact that they are logged in:
req.login(user, function (err) {
if (err) {
return res.redirect('/#!/login');
}
// console.log('=========== here!', user);
res.redirect(req.session.returnTo || '/#!');
req.session.returnTo = null;
});
})(req, res, next);
})
我正在使用本地策略进行电子邮件和密码登录。我参考了以下 link 来设置我的护照 JS 身份验证和登录:Passport Facebook
- 如上所示使用 Facebook 策略 link。
使用如下所示的路由
app.get('/auth/facebook/callback',passport.authenticate('facebook',
successRedirect: 'whatever-url-you-want',
failureRedirect: '/login' }));
我最终在客户端做了这个:
$httpProvider.interceptors.push(function ($q) {
return {
request: function (request) {
// console.log("hello");
// console.log(window.location.href);
request.headers.lastUrl = window.location.href;
return request;
},
responseError: function (response) {
return $q.reject(response);
}
};
});
服务器上的这个:
app.use(function (req, res, next) {
//req.session.returnTo is available everywhere in router now.
//filter if it not auth/login/signup, then save it. only update return to when it's not one of those.
if (req.get('lastUrl') !== undefined) {
var lastUrl = req.get('lastUrl');
if (lastUrl.indexOf("login") === -1 && lastUrl.indexOf("signup") === -1 && lastUrl !== "http://localhost:3000/#!/") {
req.session.returnTo = lastUrl;
}
console.log(req.session);
}
next();
});
希望对其他人有所帮助。我在 successRedirect 上运气不佳,我认为如果你最终都在 login/signup/taken 之类的页面远离页面,我认为这不会那么简单。
我是 passport 的新手,我正在尝试将用户重定向到他们在使用 facebook 进行身份验证后之前所在的页面。我正在尝试在会话中设置 "req.session.returnTo" 属性,但它在 facebook/auth 回调中不断消失(该函数中的所有地方都显示为未定义)。我的方法有什么问题?
受保护的路线:
app.post('/api/recipebox', ensureAuthenticated, function (req, res) {
});
确保已验证:
function ensureAuthenticated(req, res, next) {
if (req.isAuthenticated()) {
return next();
}
req.session.returnTo = req.path;
res.redirect('/#!/login');
}
//Facebook/Passport.js 回调:
app.get('/auth/facebook/callback', function (req, res, next) {
passport.authenticate('facebook', function (err, user, redirectURL) {
// console.log(' in the callback ');
if (err) {
console.log(err);
return res.redirect('/#!/login');
}
if (!user) {
return res.redirect('/#!/signup');
}
if (req.user) {
// console.log("==================== This is the user from routes.js", req.user);
res.cookie('user', JSON.stringify(user));
}
//actually storing the fact that they are logged in:
req.login(user, function (err) {
if (err) {
return res.redirect('/#!/login');
}
// console.log('=========== here!', user);
res.redirect(req.session.returnTo || '/#!');
req.session.returnTo = null;
});
})(req, res, next);
})
我正在使用本地策略进行电子邮件和密码登录。我参考了以下 link 来设置我的护照 JS 身份验证和登录:Passport Facebook
- 如上所示使用 Facebook 策略 link。
使用如下所示的路由
app.get('/auth/facebook/callback',passport.authenticate('facebook', successRedirect: 'whatever-url-you-want', failureRedirect: '/login' }));
我最终在客户端做了这个:
$httpProvider.interceptors.push(function ($q) {
return {
request: function (request) {
// console.log("hello");
// console.log(window.location.href);
request.headers.lastUrl = window.location.href;
return request;
},
responseError: function (response) {
return $q.reject(response);
}
};
});
服务器上的这个:
app.use(function (req, res, next) {
//req.session.returnTo is available everywhere in router now.
//filter if it not auth/login/signup, then save it. only update return to when it's not one of those.
if (req.get('lastUrl') !== undefined) {
var lastUrl = req.get('lastUrl');
if (lastUrl.indexOf("login") === -1 && lastUrl.indexOf("signup") === -1 && lastUrl !== "http://localhost:3000/#!/") {
req.session.returnTo = lastUrl;
}
console.log(req.session);
}
next();
});
希望对其他人有所帮助。我在 successRedirect 上运气不佳,我认为如果你最终都在 login/signup/taken 之类的页面远离页面,我认为这不会那么简单。