尝试在我的Angular应用中使用passport.js来使用Google身份验证。
我设置快速终端的方式是:
app.set('client-google-signin-path', '/google');
app.route('/auth/google')
.get(function(req, res, next) {
var mobileApp = req.headers.origin;
passport.authenticate('google', { scope: ['profile', 'email'], callbackURL: mobileApp + req.app.get('client-google-signin-path')})(req, res, next);
});
app.route('/auth/google/callback')
.get(function(req, res, next) {
//NEVER MAKES IT HERE
var mobileApp = req.headers.origin;
passport.authenticate('google', {scope: ['profile', 'email'], callbackURL: mobileApp + req.app.get('client-google-signin-path')},
function(err, user, info) {
var profile;
if(err) return next(err);
if(!info || !info.profile) return res.status(400).send("Profile not available.");
// Grab the profile info returned from google.
profile = info.profile._json;
//model logic
User.findOne({ 'email': profile.email }, function(err, user) {
if(err) return next(err);
if(!user) return res.status(400).send("There does not appear to be an account that matches, you may need to create an account and try again.");
req.logIn(user, function(err) {
if(err) return next(err);
return res.status(200).send(user);
});
});
res.status(200);
})(req, res, next);
});
我的控制器如下:
$scope.signInGoogle = function() {
return $http.get(backendConst.location + 'auth/google')
.success(function(url) {
// Redirect to google.
$window.location.href = url;
});
};
$scope.signInGoogleCallback = function() {
return $http.get(backendConst.location + 'auth/google/callback', {
params: $location.search()
})
.success(function(user) {
$scope.gRes = 'Success!';
$location.search('code', null);
$location.hash(null);
AuthModel.setUser(user);
$location.path('/');
})
.error(function(err) {
$scope.gRes = 'Authentication failed, redirecting.';
$location.path('/authenticate');
});
为了更好的衡量,我的小/谷歌重定向页面是:
<div class="container clearfix" ng-init="signInGoogleCallback()">
<h1>Google YO!</h1>
<h4>{{gRes}}</h4>
</div>
所以发生了什么,它带来了“使用谷歌登录”页面,让我选择我的帐户,然后当它调用回调时,它会快速闪烁/谷歌视图,但然后将我踢回/验证,我开始查看。做一些调试显示
return $http.get(backendConst.location + 'auth/google/callback', {
params: $location.search()
})
投掷一个空白的“错误”,即使在我的端点日志中它说/ auth / google / callback返回200.我不确定发生了什么。我知道这看起来不必要复杂但我用facebook和passport.js这样做,一切正常,除了我的端点日志显示用facebook参数“?code =”被添加到/ auth / facebook / callback url,就像我在我的控制器中的google回调函数中尝试使用{params:$ location.search()}一样。调试到端点显示它从未进入我离开// @ NEVER MAKES IT HERE注释的位置,但是当删除{params:$ location.search()}选项时,它使它成为passport.authenticate但不会超出。我完全难过了。我应该再次强调,我以完全相同的方式处理facebook身份验证,并且它完美运行。