具有Angular的Node Express Passport - 不兼容?

时间:2014-04-19 15:49:40

标签: javascript angularjs node.js express passport.js

我正在使用Passport在服务器上运行Node / Express的简单Web应用程序通过Google等进行身份验证。客户端正在使用Angular。

我无法让Angular与Passport合作登录Google。我的设置如下:

Node / Express / Passport REST端点:

app.get("/auth/google",
function(req, res, next) {
    passport = req._passport.instance;
    passport.authenticate("google", { scope: ['https://www.googleapis.com/auth/userinfo.profile', 'https://www.googleapis.com/auth/userinfo.email'] })(req, res, next);     

});

客户方......

myModule.controller("myController", function($q, $scope, $http) {
$scope.loginWithGoogle = function() {
    $http.get("myDomain/auth/google").then(function(response) {
        doStuff();
    });
}

......简单地说:

<button ng-click="loginWithGoogle ()">Login</button>

我得到的错误是'Access-Control-Allow-Origin'标头出现在请求的资源上。因此,不允许原点'myDomain'访问。'

但是,如果我直接访问REST端点,通过在浏览器中访问myDomain / auth / google,它可以正常工作。或者我可以创建一个简单的HTML <a href="/auth/google">Login</a>并让它也可以工作。所以我猜测我的客户端和服务器之间的线路出了问题。

我搜索了解决方案,找不到任何有效的方法。例如,我读了一个使用$ http.jsonp而不是$ http.get的建议。这取得了一些进展 - 如果用户已经登录Google(通过Gmail,其他应用程序等),那么他们就可以进行身份​​验证。但是,如果用户尚未登录Google,则会收到错误'未捕获的SyntaxError:意外的令牌&lt;'。我认为这是Google为其登录页面发回的HTML。

有没有办法让Angular在这里玩Node / Express / Passport?提前谢谢!

1 个答案:

答案 0 :(得分:0)

每次在发送回复时设置您的CORS标题,即使您已在主文件中处理过它们。