Javascript 在nodejs身份验证中使用passport替代findById?
我正在使用passport对用户进行身份验证。My node.js服务器充当另一台服务器的代理服务器;我可以向另一台服务器发送身份验证请求,以验证用户和密码是否正确 我在反序列化用户中需要包含的函数方面遇到了问题,因为另一台服务器不包含任何按id搜索给定用户的方法 首先,这里是我的序列化和反序列化函数。请注意,我使用用户名作为标识符Javascript 在nodejs身份验证中使用passport替代findById?,javascript,node.js,express,passport.js,Javascript,Node.js,Express,Passport.js,我正在使用passport对用户进行身份验证。My node.js服务器充当另一台服务器的代理服务器;我可以向另一台服务器发送身份验证请求,以验证用户和密码是否正确 我在反序列化用户中需要包含的函数方面遇到了问题,因为另一台服务器不包含任何按id搜索给定用户的方法 首先,这里是我的序列化和反序列化函数。请注意,我使用用户名作为标识符 passport.serializeUser(function(user, done) { done(null, user.username); });
passport.serializeUser(function(user, done) {
done(null, user.username);
});
//used to deserialize the user from the session
passport.deserializeUser(function(username, done) {
user.findByUsername(username, function(err, user) {
done(err, user);
});
});
对于本地策略,以下是我的代码:
passport.use('local-login', new LocalStrategy({
//use the fields for username and password
usernameField : 'username',
passwordField : 'password',
passReqToCallback : true
},
function(req, username, password, done) {
var loginUser = new User('username', 'password');
loginUser.authenticate(function(err, user) {
if(!user)
return done(null, false, req.flash('loginMessage', 'No user found.'));
return done(null, user);
}));
authenticate函数定义如下(为简洁起见,包含伪代码):
我应该在反序列化用户中使用什么
而且,我甚至不明白为什么反序列化用户需要用户对象。它不只是从会话中提取用户吗?或者这是我的一个基本误解?反序列化用户函数获取用户标识符(存储在会话中),并使用它从用户存储中获取完整的用户对象,以便填充express request对象的用户成员 这很有用,因为您可能不想在会话中存储完整的用户对象,而只是对它的引用,然后您可以在每次请求时从数据库或其他用户存储中获取完整的对象 在
serializeUser
和deserializeUser
中为标识符使用用户名似乎应该有效,只要两者之间的标识符一致
至于从单独的存储中序列化用户对象,该用户对象的内容主要是为了方便您。如果在某些路由中有代码需要检查用户的某些属性,则可以将其放置在此处。如果您的代码不需要知道它是有效用户以外的任何信息,那么您的用户对象可以是{username:username}
--
因此,在您的示例中,您提到您的外部服务器只能验证用户名和密码是否正确,并返回一个令牌。如果您没有其他关于用户的单独信息存储,这意味着您的应用程序希望保留的关于用户的唯一信息是他们已通过身份验证,以及他们的用户名和令牌是什么
然后,您的本地策略将类似于:
passport.use('local-login', new LocalStrategy({
//use the fields for username and password
usernameField : 'username',
passwordField : 'password',
passReqToCallback : true
},
function(req, username, password, done) {
somehowAuthenticateWithMyExternalServer(username, password, function(isValid, token) {
if(!isValid)
return done(null, false, req.flash('loginMessage', 'No user found.'));
return done(null, { username: username, token: token });
});
}));
由于您只想将此用户对象保留在会话中,而不是在任何地方将其序列化,因此序列化/反序列化函数可能只是简单的传递:
passport.serializeUser(function(user, done) {
done(null, user);
});
//used to deserialize the user from the session
passport.deserializeUser(function(user, done) {
done(null, user);
});
(在这种情况下,可能会同时忽略这些,但不确定)
然后,如果您的任何路由在
req.user
对象上进行检查,其唯一属性将是username
和'token.我没有看到的行为;这是我的要求之一。它使用用户名作为我的标识符。我遇到的问题是,我无法访问包含用户的商店。我无法根据标识符检索用户对象;我只能向它发送用户名和密码,它会告诉我它是否有效。或者我应该从我的express会话存储中检索我的用户对象吗?我很困惑。我更新了上面的答案,试图澄清这一部分,如果有帮助,请告诉我。:-)谢谢,这就更清楚了。但是,如何在会话中存储其他信息?假设我想存储用户名、令牌和散列密码,然后每次反序列化时从会话中检索这三个。这可能吗?因为这就是我的用户对象应该是什么;如果可能的话,我想通过反序列化从会话中检索这些内容。
passport.serializeUser(function(user, done) {
done(null, user);
});
//used to deserialize the user from the session
passport.deserializeUser(function(user, done) {
done(null, user);
});