node.js - NodeJS Passport : multilogin via two strategies - serialize issue

标签 node.js authentication passport.js

我想为用户提供使用以下两种策略之一登录的能力:通过 Instagram 和通常的本地策略。对于本地,我编写了简单的函数来在数据库中查找用户并提供其用户信息。这是它的工作原理:

passport.use(new InstagramStrategy({
    clientID: global.INSTAGRAM_CLIENT_ID,
    clientSecret: global.INSTAGRAM_CLIENT_SECRET,
    callbackURL: "http://**.**.**.**:3000/auth/instagram/callback"
  },
  function(accessToken, refreshToken, profile, done) {
    process.nextTick(function () {
        console.log('Access token: ' + accessToken);
        global.access_token = accessToken;
      return done(null, profile);
    });
  }
));

passport.use(new LocalStrategy(
    function(email, password, done) {
    console.log('chec user');
    process.nextTick(function() {
        db.findByEmail(email, function(err, user) {
            if (!user) {
                console.log('Unknown user ' + email);
                return done(null, false, {
                    message: 'Unknown user ' + email
                });
            }
            if (user.password != crypt.getMD5fromString(password)) {
                console.log('Invalid password');
                return done(null, false, {
                    message: 'Invalid password'
                });
            }
            return done(null, user);
        })
    });
}));

但是我的自定义序列化和反序列化函数不适用于 Instagram 策略:

    /* THESE FUNCTIONS WORK WITH INSTAGRAM STRATEGY
passport.serializeUser(function(user, done) {
  done(null, user);
});

passport.deserializeUser(function(obj, done) {
  done(null, obj);
});*/

    /*THESE ARE FOR LOCAL STRATEGY*/
passport.serializeUser(function(user, done) {done(null, user._id);});
passport.deserializeUser(function(id, done) {db.findById(id, function(err, user) {done(err, user);});});

如何避免这个错误?我的目标——提供 Instagram 登录,并在成功登录后检查——如果用户有本地帐户(通过电子邮件或 Instagram 昵称),从数据库获取数据。尽管用户应该能够通过本地策略在没有 Instagram 的情况下登录。谢谢。

最佳答案

简短的回答是:对本地和第三方验证回调使用相同的用户对象类型。你可能想在你的 Instagram 验证回调中设置它:而不是调用 done(null,profile) 你可能想创建一个新的用户对象,分配 myUser.instagram = profile 和回调 done(null, myUser) 或类似的东西。

我有一些示例代码演示了一种设置多个身份验证系统的方法。您可以在这里找到它:https://github.com/therealplato/passport-multiauth-demo/blob/master/app.js

注意事项:这是为 Express 2.x 编写的,它处理服务器的方式与 3 不同,并且具有不同的发送响应语法。 编辑,为 express 3.x 更新了演示代码

此外,这里的 Google 方法是 Oauth 1。我无法让 Oauth 1 google auth 在本地主机上工作,它给出了一个错误 ...has no method 'CharChodeAt'...

有趣的是,我今天花了很多时间让 Oauth 2 与我的本地用户一起使用。因此,如果我能找到时间,我会尝试更新 Express 3 和 Oauth 2 的演示代码,但没有任何 promise :)

关于node.js - NodeJS Passport : multilogin via two strategies - serialize issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14967989/

相关文章:

javascript - 使用nodejs和express不断出现404错误

c# - 通过 Azure Active Directory 对客户端进行身份验证以连接到 ApiApp

php - MySQL/PHP 检查登录详细信息

javascript - 基本的passport.js 注册功能失败,认为用户名已被占用

node.js - 在 React 前端从 Zoho API 获取数据时出现 CORS 错误

javascript - 如何安全地执行操作,然后从 .txt 文件中异步插入 250,000 多个单词,而不会导致堆栈溢出?

node.js - 使用Restful API通过Promise包装器调用梦m抓取多站点

asp.net - WebSecurity SimpleMembershipProvider 不能一起工作?

node.js - Passportjs req.isAuthenticated 始终显示 false

node.js - JWT token 发行和 Passport w/node js