我正在使用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?提前谢谢!
答案 0 :(得分:0)
每次在发送回复时设置您的CORS标题,即使您已在主文件中处理过它们。