0

我的应用程序在 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('/');
});

我的服务器设置在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'
      }).

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

4

1 回答 1

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') 为真时才会发生点击劫持。

于 2013-07-22T07:27:13.870 回答