我正在学习本教程,使用 Node 和 Passport 实现 Facebook 身份验证。
教程和文档都说要这样做:
router.get('/auth/facebook/callback',
passport.authenticate('facebook', {
successRedirect: '/',
failureRedirect: '/login'
})
);
但是,用户如何知道他们是否通过了身份验证?我想将数据发送到我的前端,以显示用户是否登录,并且我可以用来更新,比如我的导航栏。
据我了解,使用 Facebook 进行身份验证的过程是这样的:
- 发出
GET /auth/facebook
请求。 - 击中路线。
304 Redirect
将 url 发送回 Facebook 门户。- 使用回调 url 向 Facebook 门户发送请求。
- 用户在门户上单击“接受”。
- Facebook 发回一个
304 Redirect
带有 url 的回调 url。 - 请求被发送到您的回调 url,在这种情况下是
GET /auth/facebook/callback
. - 的运行
cb
。passport.use(obj, cb)
- A
304 Redirect
被发回,其 url取决于成功或失败/
。/login
/
向或发送请求/login
。
我不确定如何使用登录用户更新我的前端。
router.get('/auth/facebook/callback',
passport.authenticate('facebook'),
function(req, res) {
var userCopy = JSON.parse(JSON.stringify(req.user));
delete userCopy.auth;
res.status(200).json(userCopy);
}
);
这不起作用,因为没有$http.get().then()
接收数据的。
我尝试添加一些查询参数:
successRedirect: '/?foo=bar'
但这对我不起作用。网址栏说http://localhost:3000/?foo=bar#_=_
,这不会记录任何内容:
app.get('/*', function(req, res) {
var url = path.resolve(__dirname + '/../client/' + envFolder + '/index.html');
res.sendFile(url, null, function(err) {
if (err) {
return res.status(500).send(err);
}
console.log('here');
console.log(req.query);
return res.status(200).end();
});
});
当我这样做时它会起作用successRedirect: '/home?facebook=true'
。但是在里面sendFile
,我不能寄回任何东西。如果我尝试res.send('Authenticated with Facebook')
它会给我这个错误:Error: Can't set headers after they are sent.
。大概是因为sendFile
正在发回文件并设置一些标题,然后我尝试用不同的标题发回其他东西。所以我不确定该怎么做。
我到达的方法是使用run
块:
function run($http, Session, $cookies) {
$http
.get('/current-user')
.then(function(response) {
Session.setUser(response.data);
$cookies.put('userId', response.data._id);
})
;
}
- 我不确定这是最好的方法。
- 它弄乱了我的测试,因为他们不期待 HTTP 请求,并且当我不总是想要这样做时,它会设置会话和 cookie。