PassportJs。 我怎样才能得到Facebook的redirecturi没有redirect用户后调用passport.authenticate('脸谱')

我有一个NodeJs REST服务,我们把它叫做NodeRest在我的后端和AngularJs在我的前端。

假设NodeRest与移动应用程序以及Web应用程序一起使用,这是AngularJs应用程序。

NodeRest的体系结构在使用PassportJs时应该解决以下问题:

服务器不应该将用户redirect到Facebook来授权何时

app.get('/auth/facebook', passport.authenticate('facebook')); 

已被调用。

如果要redirect它,客户端将不会得到任何东西,因为callbackURL链接到NodeRest httpL // noderest / facebook / callback。 相反,它应该提供redirect的URI,所以我可以把它发回客户端(angularJs,移动等…)。 这样的笑话:

 app.get('/auth/facebook', passport.authenticate('facebook', function(redirectUri){ //emit socket event to the client with redirect uri as a response data. })); 

我在授权过程中决定使用socket.io作为通信通道。

客户:

 var socket = io.connect(baseUrl); socket.on('auth:facebook:callback:getCalled', function (data) { // callback get called on server side. // user has been authenicated. // so now, user can talk with our NodeRest server to get and post data. var firstName = data.firstName; var lastName = data.lastName; }); $http.get(baseUrl + '/login/facebook').success(function(data, status, headers, config){ redirectUriToAuthenticate = data; $location.path(data); }); 

客户端将负责redirect到facebook / twitter等,以获得用户授权。 在此之后,用户将被redirect到callbackurl。

服务器:

 app.get('/auth/facebook/callback', function(){ passport.authenticate('facebook', { successRedirect: '/', failureRedirect: '/login' }) //socket.io emit event to the client with user data. io.sockets.on('connection', function (socket) { socket.emit('auth:facebook:callback:getCalled', { data: User }); }); 

所有这一切背后的总体思路是从不同types的客户端应用程序(手机,networking,桌面等)获得授权。 客户端必须能够获得redirecturi到oauth2提供者(脸谱,微博等),并redirect到自己的uri。 NodeRest会考虑进一步的步骤(即处理callback和通知客户端)。

我不知道这是否是一个很好的解决scheme,所以任何forms的反馈都不会有帮助。 我将不胜感激任何forms的反馈。

先谢谢你,朱利安

在这个问题上护照的logging很差 – 我也很久以来一直在努力。 我发现你可以调用passport.authenticate(type,fn)(req,res,next),在fn中,你可以区分可以login的用户和不能login的用户。 不过,你可以直接调用req.logIn。

只是供参考,我假设你正在使用会议:

 module.exports.createSession = function(req, res, next) { passport.authenticate('local', function(err, user, info) { if (err) { res.json(500, {ok: false}); } else if(!user) { // you would probably want to do more work here // for example distinguishing between bad login credentials, // canceling, users not ready to log in (pending), etc. res.json(401, {ok: false}); } else { req.logIn(user, function(err) { if (err) { res.json(500,{ok: false}); } else { res.json(200, { ok:req.isAuthenticated(), username: req.user.username, email: req.user.email }); } }); } })(req, res, next); }; 

这是设置为本地身份validation,但我相信它应该与Facebook身份validation没有任何更改。