angularjs – PassportJs.如何在没有重定向用户的情况下获得facebook重定向uri后调用passport.authenticate(‘facebook’)

前端之家收集整理的这篇文章主要介绍了angularjs – PassportJs.如何在没有重定向用户的情况下获得facebook重定向uri后调用passport.authenticate(‘facebook’)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个NodeJs REST服务让我们称它为 – 我后端的NodeRest和前端的AngularJs.

NodeRest假设用于移动应用程序以及Web应用程序,在我的情况下它是AngularJs应用程序.

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

服务器不应该将用户重定向到Facebook以进行授权

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

被称为.

如果它要重定向它,客户端将不会得到任何东西,因为回调URL链接到NodeRest httpL // noderest / facebook / callback.相反它应该提供重定向uri,所以我可以将它发送回客户端(angularJs,mobile等…).像这样的Smth:

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);
});

客户将负责重定向到facebook / twitter等,以获得用户授权.之后,用户将被重定向到回调网址.

服务器:

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 });
});

所有这些东西背后的一般想法是从不同类型的客户端应用程序(移动,Web,桌面等)获得授权.客户端必须只能将uri重定向到oauth2提供商(facebook,twitter等)并自行重定向到该uri. NodeRest将关注进一步的步骤(即处理回调和通知客户端).

我不知道这是一个很好的解决方案,我正在努力,所以任何类型的反馈都将是非常有用的.任何反馈我都会感激不尽.

先感谢您,
朱利安

解决方法

护照在这个问题上的记录很少 – 我也在很长一段时间内与它斗争.我发现你可以调用passport.authenticate(type,fn)(req,res,next),在fn中,你可以区分可以登录用户和不能登录用户.你可以打电话给req.logIn.

仅供参考,我假设您正在使用会话:

module.exports.createSession = function(req,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,next);
};

这是为本地身份验证设置的,但我相信它应该与facebook auth一起使用而不做任何更改.

猜你在找的Angularjs相关文章