"Get Authenticated" 在初始启动时永远循环
"Get Authenticated" loops forver on initial startup
每当我第一次加载我的 AngularJS 应用程序时,我都会看到一个空白屏幕,这会在一个永无止境的循环中尝试检查用户是否已通过身份验证。
对于这个项目,我使用 sails version 0.11.0, the newest version of AngularJS for frontend stuff, and Bower and Yeoman (specifically generator-cg-angular yeoman 生成器)。我也在使用 satellizer,它应该对这个过程有很大帮助。
我刚刚设置我的第一个登录和注册功能,所以我可能犯了一些简单的错误。
更新:从 Sails Gitter 聊天室的一些乐于助人的人那里,我认为 "a response isn’t being sent somewhere"——我被告知的可能是错误的原因,来自一位经验丰富的开发人员。所以这可能是我的问题....还不知道,只是保持这个问题的更新。
我的部分相关代码如下:
这是我的应用程序尝试将用户发送到的第一个状态(在 app.js 文件中):
$stateProvider.state('dashboard', {
url: '/',
templateUrl: 'partial/scaffold/scaffold.html',
controller: 'ScaffoldCtrl as scaffold',
data: { loginRequired: true } // will also apply to all children of 'dashboard'
});
这些是我的 dashboard.auth 服务的内容,我知道这对于获得工作授权至关重要。
var currentUser,
isAuthenticated = false,
baseAuth = Restangular.all('user');
return {
login: function (credentials) {
return baseAuth.customPOST(credentials, 'login').then(function (user) {
$log.debug('User logged in: ', user);
isAuthenticated = true;
return user;
});
},
logout: function () {
return baseAuth.customPOST({}, 'logout').then(function () {
currentUser = undefined;
isAuthenticated = false;
});
},
register: function (newUser) {
return baseAuth.customPOST(newUser, 'register').then(function (user) {
isAuthenticated = true;
return user;
});
},
currentUser: function () {
return currentUser;
},
isAuthenticated: function (force) {
var deferred = $q.defer();
if (isAuthenticated && currentUser) {
deferred.resolve(currentUser);
} else {
return baseAuth.customGET('authenticated').then(function (user) {
deferred.resolve(currentUser);
isAuthenticated = true;
currentUser = user;
return user;
});
}
return deferred.promise;
}
};
后端控制器:
注册
register: function (req, res) {
RegistrationService.registerUser(req.body, function (err, user) {
if (err) { res.json(400, err); }
return res.json(user);
});
},
登录
login: function (req, res) {
passport.authenticate('user', function (err, user, info) {
if (err) { return res.json(err); }
else if (user) {
req.logIn(user, function (err) {
if (err) { return res.json(err); }
return res.json(user);
});
} else { return res.json(400, info); }
})(req, res);
},
然后在后端有很多不同的代码,它们应该都是非常标准的,我试着遵循我从教程中找到的最佳实践。如果您知道我的应用程序发生了什么,请告诉我。
这是当我转到 http://localhost:9001/#/ 应用程序 运行 时记录到控制台的错误(它在一个循环中不断循环...)。
[Array[0], "get", "authenticated",
"http://localhost:1337/user/authenticated"] angular.js:12314 ["",
"get", "authenticated", "http://localhost:1337/user/authenticated"]
angular.js:12314 [Array[0], "get", "authenticated",
"http://localhost:1337/user/authenticated"] angular.js:12314 ["",
"get", "authenticated", "http://localhost:1337/user/authenticated"]
angular.js:12314 [Array[0], "get", "authenticated",
"http://localhost:1337/user/authenticated"] angular.js:12314 ["",
"get", "authenticated", "http://localhost:1337/user/authenticated"]
angular.js:12314 [Array[0], "get", "authenticated",
"http://localhost:1337/user/authenticated"]
好的,我更改了 API 中的控制器和前端的 app.js 文件。所以问题出在其中一个地方。
我认为真正的问题出在后端逻辑上。
我进行了一次重大简化...并且成功了。
将注册操作更改为:
register: function (req, res) {
User.create(req.body, function (err, user) {
if (err) { next(err); }
return res.json(user);
});
},
将登录操作更改为:
login: function (req, res, next) {
User.findOne( { email: req.body.email }, function (err, user) {
if (err) { return next(err); }
if (user) {
bcrypt.compare(req.body.password, user.password, function (err, valid) {
if (err) { next(err); }
if (valid) {
req.session.userAuthenticated = true;
req.session.authenticated = true;
req.session.User = user;
return res.json({
message: "Logged in"
});
}
});
} else { next({ message: "Could not find a user with email " + req.body.email }); }
});
},
这似乎成功了。
每当我第一次加载我的 AngularJS 应用程序时,我都会看到一个空白屏幕,这会在一个永无止境的循环中尝试检查用户是否已通过身份验证。
对于这个项目,我使用 sails version 0.11.0, the newest version of AngularJS for frontend stuff, and Bower and Yeoman (specifically generator-cg-angular yeoman 生成器)。我也在使用 satellizer,它应该对这个过程有很大帮助。
我刚刚设置我的第一个登录和注册功能,所以我可能犯了一些简单的错误。
更新:从 Sails Gitter 聊天室的一些乐于助人的人那里,我认为 "a response isn’t being sent somewhere"——我被告知的可能是错误的原因,来自一位经验丰富的开发人员。所以这可能是我的问题....还不知道,只是保持这个问题的更新。
我的部分相关代码如下:
这是我的应用程序尝试将用户发送到的第一个状态(在 app.js 文件中):
$stateProvider.state('dashboard', {
url: '/',
templateUrl: 'partial/scaffold/scaffold.html',
controller: 'ScaffoldCtrl as scaffold',
data: { loginRequired: true } // will also apply to all children of 'dashboard'
});
这些是我的 dashboard.auth 服务的内容,我知道这对于获得工作授权至关重要。
var currentUser,
isAuthenticated = false,
baseAuth = Restangular.all('user');
return {
login: function (credentials) {
return baseAuth.customPOST(credentials, 'login').then(function (user) {
$log.debug('User logged in: ', user);
isAuthenticated = true;
return user;
});
},
logout: function () {
return baseAuth.customPOST({}, 'logout').then(function () {
currentUser = undefined;
isAuthenticated = false;
});
},
register: function (newUser) {
return baseAuth.customPOST(newUser, 'register').then(function (user) {
isAuthenticated = true;
return user;
});
},
currentUser: function () {
return currentUser;
},
isAuthenticated: function (force) {
var deferred = $q.defer();
if (isAuthenticated && currentUser) {
deferred.resolve(currentUser);
} else {
return baseAuth.customGET('authenticated').then(function (user) {
deferred.resolve(currentUser);
isAuthenticated = true;
currentUser = user;
return user;
});
}
return deferred.promise;
}
};
后端控制器:
注册
register: function (req, res) {
RegistrationService.registerUser(req.body, function (err, user) {
if (err) { res.json(400, err); }
return res.json(user);
});
},
登录
login: function (req, res) {
passport.authenticate('user', function (err, user, info) {
if (err) { return res.json(err); }
else if (user) {
req.logIn(user, function (err) {
if (err) { return res.json(err); }
return res.json(user);
});
} else { return res.json(400, info); }
})(req, res);
},
然后在后端有很多不同的代码,它们应该都是非常标准的,我试着遵循我从教程中找到的最佳实践。如果您知道我的应用程序发生了什么,请告诉我。
这是当我转到 http://localhost:9001/#/ 应用程序 运行 时记录到控制台的错误(它在一个循环中不断循环...)。
[Array[0], "get", "authenticated", "http://localhost:1337/user/authenticated"] angular.js:12314 ["", "get", "authenticated", "http://localhost:1337/user/authenticated"] angular.js:12314 [Array[0], "get", "authenticated", "http://localhost:1337/user/authenticated"] angular.js:12314 ["", "get", "authenticated", "http://localhost:1337/user/authenticated"] angular.js:12314 [Array[0], "get", "authenticated", "http://localhost:1337/user/authenticated"] angular.js:12314 ["", "get", "authenticated", "http://localhost:1337/user/authenticated"] angular.js:12314 [Array[0], "get", "authenticated", "http://localhost:1337/user/authenticated"]
好的,我更改了 API 中的控制器和前端的 app.js 文件。所以问题出在其中一个地方。
我认为真正的问题出在后端逻辑上。
我进行了一次重大简化...并且成功了。
将注册操作更改为:
register: function (req, res) {
User.create(req.body, function (err, user) {
if (err) { next(err); }
return res.json(user);
});
},
将登录操作更改为:
login: function (req, res, next) {
User.findOne( { email: req.body.email }, function (err, user) {
if (err) { return next(err); }
if (user) {
bcrypt.compare(req.body.password, user.password, function (err, valid) {
if (err) { next(err); }
if (valid) {
req.session.userAuthenticated = true;
req.session.authenticated = true;
req.session.User = user;
return res.json({
message: "Logged in"
});
}
});
} else { next({ message: "Could not find a user with email " + req.body.email }); }
});
},
这似乎成功了。