ExpressJS和Angular - "离开"应用程序进行服务器端身份验证

JVG*_*JVG 0 javascript node.js express angularjs passport.js

我的应用程序在NodeJS,ExpressJS和AngularJS上运行.我正在尝试使用PassportJS进行Facebook身份验证.为了避免发布一堆不必要的代码,让我们假设Passport代码按预期工作并登录到Facebook,抓取令牌并收到响应.

在ExpressJS中,我的路由设置如下:

app.get('/', routes.index);
app.get('/fbauth', passport.authenticate('facebook', { scope: 'email' }));
app.get('/fbauthed', passport.authenticate('facebook',{ failureRedirect: '/' }), routes.loggedin);
app.get('/logout', function(req, res) {
  req.logOut();
  res.redirect('/');
});
Run Code Online (Sandbox Code Playgroud)

我的服务器设置为localhost:3000.

我的问题是Angular完全没有表现出来.当我在我的页面上放置一个链接href="/fbauth"(这转到localhost:3000/fbauth)时,我看到地址栏改变localhost:3000/fbauth为一瞬间,然后我的localhost:3000主页重新加载.

但是,如果我输入localhost:3000/fbauth地址栏,验证就会发生,我会传递给Facebook - > localhost:3000/fbauthed.

认为这是因为Angular路由试图"接管" <a>链接中的URL ,但我不知道如何实现它.我已经尝试将我的Angular路由配置为:

when('/fbauth', {
        redirectTo: '/fbauth'
      }).
Run Code Online (Sandbox Code Playgroud)

但这会加载一个空白屏幕.我怎样才能让两者一起工作?

Gri*_*ead 5

添加target ="_ self"在Angular 1.0.1中起作用:

用Facebook登录

此功能已记录在案(http://docs.angularjs.org/guide/dev_guide.services.$ location - 搜索'_self')

如果你很好奇,请查看角度源(第5365行@ v1.0.1).只有在!elm.attr('target')为真时才会发生点击劫持.