使用Passportjs从Angularjs(http get / resource)进行用户身份验证

时间:2013-04-25 23:39:12

标签: angularjs node.js passport.js

我试图使用带有Angular和Express的Passportjs。我正试图在passportjs中测试facebook策略。

身份验证似乎成功但未导航到回调网址。它简单化了。

Firebug控制台显示:     GET http:// localhost:7000 / auth / facebook 302暂时移动“

然而,当我手动点击此网址但不会自动重定向时,它会在浏览器窗口中成功打开回调网址(索引)

我的登录视图(jade)如下所示:

a(href='/auth/facebook')
 p Login

和服务器端路由是:

app.get('/auth/facebook',  passport.authenticate('facebook'));
app.get('/auth/facebook/callback', passport.authenticate('facebook', { failureRedirect: '/login' }),
function(req, res) {
res.render('index');
 });

请帮助。这是我第一次使用Angularjs& amp;节点js

编辑:更确切地说,只有当我的请求来自客户端(Angular中的登录页面)到我的快速服务器时,才会出现此问题。         如果我从快递中提供登录页面,则没有问题。身份验证很好,并按预期重定向到我的应用程序。

当服务器使用passportjs处理身份验证时,我们是否可以从客户端(使用http get / post)向服务器发出身份验证请求?

2 个答案:

答案 0 :(得分:1)

我目前正在尝试做同样的事情并遇到问题,但也许我可以澄清一些事情并提出一些建议。

幕后制作PassportJS的Facebook战略正在使用OAuth。通过使用这种方法,它将所有身份验证卸载到Facebook的服务器上。当您单击带有href =“/ auth / facebook”的链接时,您的快速服务器会将用户重定向到Facebook,然后再返回到您的应用程序。必须这样做以确保安全的身份验证,否则有人可能声称他们是Facebook并且自己“验证”用户。这也是调用Angular $ http.get(“/ auth / facebook”)不起作用的原因,它只是返回302重定向。

不幸的是,这是挑战的地方。如果您只是包含一个带有href“/ auth / facebook”的链接,服务器将对用户进行身份验证并返回到您的应用程序,但Angular无法知道您的用户已经过身份验证。我在这里https://github.com/enginous/angular-oauth找到了一个有角度的oauth示例,但我在消化它时遇到了一些麻烦。基本上他正在使用弹出窗口打开身份验证链接,在您的情况下为“/ auth / facebook”,并使用浏览器$ window.postMessage与用户进行身份验证后收到的访问令牌通信回到他的主应用程序窗口然后关闭弹出窗口。

我认为这可能是最好的方法,但我仍然没有使用Passport。我很想听到其他人的想法/意见,因为我还是刚刚接触Angular的新人!

更新: 我最近看到了这篇博文http://www.frederiknakstad.com/authentication-in-single-page-applications-with-angular-js/,其中展示了使用Passport的Facebook策略与Angular的一个例子。他似乎在成功验证后设置了一个cookie,并在页面加载时对cookie进行了Angular轮询。这可能是一个更容易的解决方案。

答案 1 :(得分:0)

我遇到了同样的问题,问题是角度如何发送请求。我开始使用$http.get,它到达我的节点服务器,但正如你所说,挂在那里。 当我切换到$window.location.href时,它完美地工作,因为这个请求可以被链接。