我正在尝试实现类似于 StackOverflow 的登录/注册系统,也就是说:
- 注册和登录链接都指向 /users/login,
- 用户点击 OAuth 提供商(例如 Google),无论他们是注册还是登录,
- 如果帐户尚不存在(确认帐户创建的页面),OAuth 回调将转到 /users/authenticate,如果帐户已存在,则转到 /。
- (如果帐户是新帐户,我将在此处添加管理员帐户验证步骤,但对于此问题而言不太重要。)
我不确定我是否正确地处理了这个问题。相关代码如下。
查看配置文件是否存在于数据库中;如果没有,返回内存中的配置文件,status = "new":
passport.use(new GoogleStrategy({
clientID: config.google_client_id,
clientSecret: config.google_client_secret,
callbackURL: "/auth/google/callback"
},
function (accessToken, refreshToken, profile, done) {
// asynchronous verification, for effect...
process.nextTick(function () {
db.db.collection("users", function (err, collection) {
if (err) throw err;
collection.findOne({id: profile.id}, function (err, record) {
if (record) return done(null, record);
profile.status = "new";
done(null, profile);
});
});
});
})
);
根据状态选择 OAuth 之后的重定向路由:
app.get('/auth/google/callback',
passport.authenticate('google', { failureRedirect: '/users/login' }),
function (req, res) {
switch (req.user.status) {
case "validated":
res.redirect('/'); break;
case "new":
res.redirect('/users/oauthconfirm'); break;
case "pending":
res.redirect('/users/login'); break;
}
}
);
最后,确认新账户的途径:
// app.js
app.get('/users/oauthconfirm', routes.users.oauthconfirm);
// routes/users.js
exports.oauthconfirm = function(req, res) {
db.db.collection("users", function (err, collection) {
if (err) throw err;
collection.insert(req.user, function (err, records) {
if (err) throw err;
res.render('login', {messages: [{status: "success", text:"Thank you. You will receive an e-mail when your account is validated."}]});
});
});
};
这样做的“正确”方法是什么?我很确定我的验证回调代码不合适。谢谢-