我第一次设置身份验证功能,在用户登录后得到了一些意外的结果。一位同事给了我一个具有工作身份验证的应用程序,以模仿我的应用程序,看起来我所做的一切都是正确的。
我在前端使用 AngularJS,在后端框架使用 SailsJS,并且护照JS http://passportjs.org/身份验证中间件。
我的源代码(目前)是公开存储的...后端 API 位于 Github 上(API GitHub https://github.com/djlovegrind/smallChange-API),前端代码可以在这里找到(前端 Github https://github.com/djlovegrind/smallChange-dashboard)
基本上发生的事情是用户
-
点击登录按钮,触发此功能
login: function (credentials) {
return baseAuth.customPOST(credentials, 'login').then(function (user) {
$log.debug('User logged in: ', user);
isAuthenticated = true;
return user;
});
},
-
该 customPOST 的控制器逻辑是这样的
login: function (req, res, next) {
passport.authenticate('local', 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);
},
-
在那一步中,护照应该做它的事情并登录用户
passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password' },
function(email, password, next) {
User.findOne({ email: email })
.exec(function (err, user) {
if (err) { return next(err); }
if (user) {
if (user.activated) {
bcrypt.compare(password, user.password, function (err, valid) {
if (err) { next(err); }
if (valid) {
return next(null, user, { message: 'Logged In' });
} else { return next(null, false, { message: 'Incorrect password'}); }
});
} else { next(null, false, { message: 'User is not activated. Please contact admins.'}); }
} else { next(null, false, { message: 'Could not find user with email ' + email }); }
});
}
));
在控制台中,我总是知道这是成功的。
控制台显示:
User logged in: Object {firstName: "John", lastName: "Doe", email: "[email protected] /cdn-cgi/l/email-protection", activated: true, isUser: true…}
-
然后,我对发生的事情的理解变得有点模糊。我知道应用程序然后会尝试查看用户是否经过身份验证。 IsAuthenticated 被触发,在 AngularJS 中看起来像这样:
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;
}
-
它在后端 UserController 中执行此操作
isAuthenticated: function (req, res) {
if (req.isAuthenticated() && req.user.isUser) { return res.json(req.user); }
else { return res.send(401); }
},
然后就失败了:(GET http://localhost:1337/user/authenticated 401 (Unauthorized)
req.isAuthenticated 和 req.user.isUser 均未通过。我把它们分开来单独测试,但它们都不是真的。 “isUser”是我默认为 true 的值,因此对于数据库中的每个用户都应该为 true。 req.isAuthenticated 也失败,我不完全理解。
有人对我的问题有一些见解吗?我在这里做错了什么?
如果您的前端应用程序与后端应用程序具有不同的来源AJAX 请求不会包含会话 cookie https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials and req.isAuthenticated()
永远不会返回 true。
使用 withCredentials 选项强制执行。
$http({ withCredentials: true, ... })
看起来 Restangular 使用相同的选项:
https://github.com/mgonto/restangular#setdefaulthttpfields https://github.com/mgonto/restangular#setdefaulthttpfields
https://docs.angularjs.org/api/ng/service/$http#usage https://docs.angularjs.org/api/ng/service/%24http#usage
编辑:您还应该检查服务器端配置 http://sailsjs.org/documentation/anatomy/my-app/config/cors-js正如 idbehold 所指出的
正如 Matan 所建议的,您确实应该尝试一下服务器端的 sails-generate-auth 生成器。
https://github.com/sails101/even-more-passport https://github.com/sails101/even-more-passport
https://github.com/kasperisager/sails-generate-auth https://github.com/kasperisager/sails-generate-auth
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)