更新:下面的当前解决方案。
我将facebook登录添加到我的网站 - 我希望这很简单,但证明很难。
(内置:Node.js / Express API和Angular前端)
所以我的问题我请求帮助:
1 - 而不是successRedirect返回令牌
我使用passport-facebook
来帮助登录过程,但是在回调而不是successRedirect中,我只能说返回一些包含令牌的json。请注意,令牌是我已经使用标准电子邮件身份验证的JWT令牌,我目前在passport.serializeUser
创建此令牌:
passport.serializeUser(function(user, done) {
var token = ///implementation for token
done(null, user);
});
然后在回调中执行类似的操作:
router.get('/login/facebook/callback',
passport.authenticate('facebook', {
res.json({success: true, token:token)
})
);
2 - 如何处理客户端
然后我无法理解的第二点是,如果我退回令牌,在我的客户端,我将会选择'通常的$http.get
方法。但是URL流程将如何工作 - 我的意思是我有一个登录Facebook'按钮,然后调用服务器端router.get('/login/facebook'
,重定向到Facebook登录页面,这样一旦完成并返回一个令牌,它将如何知道返回主页。
希望我的上述问题有意义 - 我是Angular的新手,所以请原谅我,如果不清楚我能解释的最好的意愿。
解决方案(请告诉我你的想法,如果有什么不好我做的事) 经过一番思考后,我用以下方法解决了这个问题:
1 - 在回调中,我创建了一个新的API get路由。然后,我在URL中发送用户ID以创建我的自定义JWT令牌:
router.get('/login/facebook/callback',
passport.authenticate('facebook',
{ session: false, failureRedirect: "/processfblogin/false" }),
function(req, res) {
res.redirect("/api/processfblogin/" + req.user._id);
}
);
然后从这里开始制作令牌并发送URL。
所以这就是有趣的地方。理想情况下我想使用$http
get但是CORs一直给我302.所以最后我将令牌附加为URL参数并将其发送为:
res.redirect('http://localhost:3000/#/fbToProcess/' + token);
然后,我使用自己的控制器制作了这个单页,只需获取令牌,保存它,并在我的页面上进行任何明智的点击。
我将继续寻找一种在json响应中发送令牌的方法,这样用户就不需要转到这个新的空页面,但在此之前它起作用了: - )