Angular / Node / Express / Passport跨域问题 – 启用CORS Passport Facebook身份validation

尝试使用Passport在NodeJS / Express中使用Facebook对用户进行身份validation时,已经有两天,一百万次尝试启用CORS。

我在Chrome上遇到的错误是这样的:

XMLHttpRequest cannot load https://www.facebook.com/dialog/oauth?response_type=code&redirect_uri=http%…%3A8080%2Fauth%2Ffacebook%2Fcallback&scope=email&client_id=598171076960591. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8080' is therefore not allowed access. 

我使用的路线非常简单:

 // ===================================== // FACEBOOK ROUTES ===================== // ===================================== // route for facebook authentication and login app.get('/auth/facebook', passport.authenticate('facebook', { scope : 'email' })); // handle the callback after facebook has authenticated the user app.get('/auth/facebook/callback', passport.authenticate('facebook', { successRedirect : '/home', failureRedirect : '/login' })); 

这是如何在我的angularJS文件上调用路由(我也尝试设置withCredentials:true):

 $http.get('/auth/facebook') .success(function(response) { }).error(function(response){ }); 

我试过了在StackOverflow和其他论坛上find的一打解决scheme。

  1. 我试图在routes.js文件的路由上添加这个:

     app.all('*', function(req, res, next) { res.header('Access-Control-Allow-Origin', '*'); res.header("Access-Control-Allow-Headers", "Content-Type,X-CSRF-Token, X-Requested-With, Accept, Accept-Version, Content-Length, Content-MD5, Date, X-Api-Version, X-File-Name"); res.header('Access-Control-Allow-Methods', 'GET,POST,PUT,HEAD,DELETE,OPTIONS'); res.header('Access-Control-Allow-Credentials', true); if ('OPTIONS' == req.method) { res.send(200); } else { next(); } }); 
  2. 我试着在server.js文件中添加这个(注意我把头部改为了setHeader,但是我都试过了):

     app.use(function(req, res, next) { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Access-Control-Allow-Headers', 'Content-Type,X-Requested-With'); res.setHeader('Access-Control-Allow-Methods', 'GET,POST,PUT,HEAD,DELETE,OPTIONS'); res.setHeader('Access-Control-Allow-Credentials', true); if ('OPTIONS' == req.method) { res.send(200); } else { next(); } }); require('./app/routes.js')(app, passport); 
  3. 我试着在我的app.js文件(angularJSconfiguration)上添加这个:

     $httpProvider.defaults.useXDomain = true; delete $httpProvider.defaults.headers.common['X-Requested-With']; $httpProvider.defaults.withCredentials = true; 

无论如何,我不知道还有什么要做。 我在网上find的一切都不起作用。 有没有机会与我使用AngularJS路由? 我看不出有什么理由为什么这么重要,但是我有点不敢猜测。

我的情况和这个非常相似: Angular / Node / Express / Passport – 连接到facebook(CORS)时的问题

提前致谢!

当时我遇到了这个问题,几乎到了让我确信我找不到解决scheme的地步,但又看了一个简单的教程( http://mherman.org/blog/2013/11/10/social-authentication-with- passport-dot-js / )为我解决了它。 我试图做一个从Angular到Node.js的API调用,尽pipe你在服务器上configuration了CORS,CORS总是会给你带来那些XMLHttpRequest错误! CORS不是固定装置 – 如果你打开了你的Chromenetworking控制台,你会发现你对Google或Facebook或任何第三方站点的请求是你无法控制的改变 – 它是由302redirect触发的您的前端,Angular.js或其他任何框架都无法控制的东西,因此您无法真正将“访问控制允许来源”添加到该请求中。

解决方法是简单地使button或文字说“用_____login”一个链接。 一个文字<a href="/auth/facebook"></a>链接。 而已。

当然,我也遇到了很多其他的绊脚石和陷阱。 我试图不使用passport.authenticate('脸谱')的默认中间件,但试图把它包装在一个function(req, res, next){ ... } ,认为会做一些事情,但它不。

我也有一个Facebook的login和Cors问题,但不是与护照在NodeJS / Express,我的应用程序是Java(弹簧mvc)+angular。 我已经设法通过修改我的初始fblogin函数的问题:

 $scope.loginWithFacebook = function () { $http({ method: 'GET', url: 'auth/facebook', dataType: 'jsonp' }).success(function(data){ console.log('loginWithFacebook success: ', data); }).error(function(data, status, headers, config) { console.log('loginWithFacebook error: ', data); }); } 

 $scope.loginWithFacebook = function() { $window.location = $window.location.protocol + "//" + $window.location.host + $window.location.pathname + "auth/facebook"; }; 

希望能帮助到你!