Node.js 将多个第三方和本地帐户与Passport链接在一起

Node.js 将多个第三方和本地帐户与Passport链接在一起,node.js,authentication,express,authorization,passport.js,Node.js,Authentication,Express,Authorization,Passport.js,我已成功地按照建议将帐户链接到用户。如果登录用户使用OAuth 2.0(例如Google Contacts API)授权第三方,我可以将该信息保存在一个帐户中,然后将该帐户绑定到登录用户 我想更进一步,使登录体验尽可能无缝。一旦用户将其身份绑定到第三方帐户,我希望他们不仅能够使用本地策略(用户名/pwd)登录,然后获取相关的第三方信息,还可以通过另一种方式:当注销时,连接到谷歌将以我的应用程序用户的身份登录,使req.user=他们的用户信息与他们使用本地策略登录时一样。下面是相关的代码块(这里

我已成功地按照建议将
帐户
链接到
用户
。如果登录用户使用OAuth 2.0(例如Google Contacts API)授权第三方,我可以将该信息保存在一个帐户中,然后将该帐户绑定到登录用户

我想更进一步,使登录体验尽可能无缝。一旦用户将其身份绑定到第三方帐户,我希望他们不仅能够使用本地策略(用户名/pwd)登录,然后获取相关的第三方信息,还可以通过另一种方式:当注销时,连接到谷歌将以我的应用程序用户的身份登录,使req.user=他们的
用户
信息与他们使用本地策略登录时一样。下面是相关的代码块(这里有更多的内容,但重点在这里)

passport.use(new GoogleStrategy({
        clientID: google_params.client_id,
        clientSecret: google_params.client_secret,
        callbackURL: google_params.callbackURL,
        passReqToCallback: true
    },
    function(req, token, refreshToken, profile, done) {

...
        // If no user in session, set the req.user to the associated user
        User.findOne({
        'username': account.userId
        }, function(err, user) {
            console.log('Account exists already in DB, and is already tied to a user. Logging into users account.');
            req.user = user;
            return done(null, account);
        });

etc...

在检查serialize/deserialize函数时,此代码从不将用户或帐户信息序列化到会话,因此,尽管在验证回调结束时传递了这些信息,但在页面刷新时它会消失(同样,因为没有任何内容保存到会话中).我该怎么办?我的想法正确吗?

看看本教程:


看看本教程:


现在回答有点晚,但我一直在研究我正在构建的一个应用程序,它可能会帮助其他人

因此,答案是肯定的,您可以让用户链接他们的帐户,而无需他们创建本地帐户(如Scotch.io教程中所建议的)。诀窍是管理帐户的重复数据消除

无论他们使用哪个提供商登录,我们都会按顺序处理以下检查:

  • 如果此提供程序的用户已存在:请将其重新登录
  • 如果此提供商尚未存在用户:请检查电子邮件地址(或提供商之间的其他公共字段)是否存在用户。如果存在,请链接帐户并登录
  • 如果此提供商或其他提供商没有用户:使用从提供商获取的信息创建新的用户模型,然后登录
  • 应为您支持的所有提供商执行此操作。通过使用第三方服务(如电子邮件地址)预先验证的公共字段,我们可以消除重复帐户。另一个功能可能是允许用户在需要链接具有不同电子邮件地址的帐户时手动将它们链接在一起(github经常出现这种情况,他们使用个人帐户,然后想将其连接到工作帐户,例如CI提供商)

    希望这能有所帮助。如果您找到了其他解决方案,最好将其添加到此处或遇到任何问题。我认为这是一个非常常见的情况,可以将其转换为wiki

    **更新**

    • 来自@jaredhanson的评论


      在经历了很多可能的流程和谷歌搜索之后,现在给出答案有点晚了,但我一直在研究我正在构建的一个应用程序,它可能会帮助其他人

      因此,答案是肯定的,您可以让用户链接他们的帐户,而无需他们创建本地帐户(如Scotch.io教程中所建议的)。诀窍是管理帐户的重复数据消除

      无论他们使用哪个提供商登录,我们都会按顺序处理以下检查:

    • 如果此提供程序的用户已存在:请将其重新登录
    • 如果此提供商尚未存在用户:请检查电子邮件地址(或提供商之间的其他公共字段)是否存在用户。如果存在,请链接帐户并登录
    • 如果此提供商或其他提供商没有用户:使用从提供商获取的信息创建新的用户模型,然后登录
    • 应为您支持的所有提供商执行此操作。通过使用第三方服务(如电子邮件地址)预先验证的公共字段,我们可以消除重复帐户。另一个功能可能是允许用户在需要链接具有不同电子邮件地址的帐户时手动将它们链接在一起(github经常出现这种情况,他们使用个人帐户,然后想将其连接到工作帐户,例如CI提供商)

      希望这能有所帮助。如果您找到了其他解决方案,最好将其添加到此处或遇到任何问题。我认为这是一个非常常见的情况,可以将其转换为wiki

      **更新**

      • 来自@jaredhanson的评论

        在经历了很多可能的流程和谷歌搜索之后,