0

我正在尝试实现类似于 StackOverflow 的登录/注册系统,也就是说:

  1. 注册和登录链接都指向 /users/login,
  2. 用户点击 OAuth 提供商(例如 Google),无论他们是注册还是登录,
  3. 如果帐户尚不存在(确认帐户创建的页面),OAuth 回调将转到 /users/authenticate,如果帐户已存在,则转到 /。
  4. (如果帐户是新帐户,我将在此处添加管理员帐户验证步骤,但对于此问题而言不太重要。)

我不确定我是否正确地处理了这个问题。相关代码如下。

查看配置文件是否存在于数据库中;如果没有,返回内存中的配置文件,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."}]});
        });
    });
};

这样做的“正确”方法是什么?我很确定我的验证回调代码不合适。谢谢-

4

1 回答 1

0

如何使用 OpenId passport-googleOpenId 配置策略

如何使用 OAuth 进行 OAuth passport-google-oauthOAuth 配置策略

通过阅读您的代码,我实际上无法判断您要申请哪一个。似乎是 OAuth,但后来我看到了一条/users/openidconfirm我觉得不必要的路线。

我将与您分享我找到的 2 个链接:

  1. OpenID 与 OAuth
  2. OpenID 和 OAuth 有什么区别?

也许您可以改善您的问题/麻烦,以便我可以详细说明一个更好的答案。

希望这会有所帮助。

于 2013-07-21T18:55:48.133 回答