【问题标题】:Link Twitter Account with Passportjs after local user auth is completed with passportjs使用passportjs完成本地用户身份验证后,将Twitter帐户与Passportjs相关联
【发布时间】:2015-12-28 14:32:03
【问题描述】:

我只是想在还有用户之后链接 Twitter 帐户。

首先我有一个这样的 router.js

// GET Registration Page
router.get('/signup', function(req, res){
    res.render('register',{noty: req.flash('message')});
});

// Handle Registration POST 
router.post('/signup', passport.authenticate('signup', {
    successRedirect: '/connect_twitter',
    failureRedirect: '/signup',
    failureFlash : true  
}));  

/* GET Twitter Auth*/
router.get('/login/twitter', passport.authenticate('twitter'));
router.get('/login/twitter/return', 
    passport.authenticate('twitter', { failureRedirect: '/' }),
    function(req, res) {
        res.redirect('/home');
});

如果成功,我将"/connect_twitter" 重定向到req.user != null ,即当前用户。在"/connect_twitter" 一个带有按钮的重定向推特。

当 twitter 返回用户的令牌时,我使用这个策略

passport.use(new TwitterStrategy({
    consumerKey: config.twitter.consumer_key,
    consumerSecret: config.twitter.consumer_secret,
    callbackURL: config.tw_callback 
  },
  function(token, tokenSecret, profile, cb) {
    // In this example, the user's Twitter profile is supplied as the user
    // record.  In a production-quality application, the Twitter profile should
    console.log(profile);
        findOrCreateUser = function(){
            // find a user in Mongo with provided username
            User.findOne({'tw_user_id': profile.id}, function(err, user) {
                // In case of any error, return using the done method
                if (err){
                    return cb(err);
                }
                // already exists
                if (user) {
                    user.tw_token = token;
                    user.tw_token_secret = tokenSecret;
                    user.save(function(err){
                        if (err) {
                            throw err;
                        } 
                        console.log("User Updating successfull !");
                    })
                    return cb(null, user);
                } else {
                    // create the user
                    var newUser = new User();
                    // set the user's local credentials
                    newUser.password = createHash(token);
                    newUser.username = profile.username;
                    newUser.email = null; 
                    newUser.tw_token = token;
                    newUser.tw_user_id = profile.id;
                    newUser.tw_token_secret = tokenSecret;
                    // save the user
                    newUser.save(function(err) {
                        if (err){
                            console.log('Error in Saving user: '+err);  
                            throw err;  
                        }
                        console.log('User Registration succesful');    
                        return cb(null, newUser);
                    });
                }
            });
        };

        process.nextTick(findOrCreateUser);

  }));

问题是如何在这个函数function(token, tokenSecret, profile, cb)中访问current_user或者关于当前用户的任何东西? 我认为,如果我访问它,我会将当前用户与这些令牌相关联。

或者

有没有更好的(任何)方法将 twitter 与当前用户联系起来?

提前谢谢..

【问题讨论】:

    标签: javascript node.js express twitter passport.js


    【解决方案1】:

    passportjs docs

    验证回调中的关联

    上述方法的一个缺点是它需要相同策略和支持路线的两个实例。

    为避免这种情况,请将策略的 passReqToCallback 选项设置为 true。启用此选项后,req 将作为第一个参数传递给验证回调。

    passport.use(new TwitterStrategy({
        consumerKey: TWITTER_CONSUMER_KEY,
        consumerSecret: TWITTER_CONSUMER_SECRET,
        callbackURL: "http://www.example.com/auth/twitter/callback",
        passReqToCallback: true
      },
      function(req, token, tokenSecret, profile, done) {
        if (!req.user) {
          // Not logged-in. Authenticate based on Twitter account.
        } else {
          // Logged in. Associate Twitter account with user.  Preserve the login
          // state by supplying the existing user after association.
          // return done(null, req.user);
        }
      }
    ));
    

    使用req 作为参数传递,验证回调可以使用请求的状态来定制身份验证过程,使用单个策略实例和路由集处理身份验证和授权。例如,如果用户已经登录,则可以关联新“连接”的帐户。也可以使用在 req 上设置的任何其他特定于应用程序的属性,包括 req.session

    顺便说一句,您可以处理与当前用户及其数据相关联的任何社交策略,包括 Twitter。

    【讨论】:

      【解决方案2】:

      您可以通过两种方式做到这一点:

      1. 您可以从 Twitter 响应中获取用户电子邮件,并将其与数据库中具有相同电子邮件的用户匹配,而不是尝试在 Twitter 策略中获取 req.user。通常,您无法直接从 Twitter API 获得电子邮件,您需要填写请求表 here 以获得更高的访问权限。接受请求后,您将能够从 Twitter API 收到电子邮件。

      2. twitter 登录后,您可以将用户 twitter 个人资料信息保存在临时表中,并重定向一个页面,如 /user/do_login?twitter_profile_id=<user_twitter_profile_id_fetched_from_twitter_response>。当您重定向到/user/do_login 时,您将能够访问req.user,并且您将拥有用户配置文件ID。在此操作中,您可以从临时表中获取用户配置文件信息并将其与req.user 合并。顺便说一句,我假设您正在使用存储会话。

      【讨论】:

        猜你喜欢
        • 2020-12-21
        • 2014-04-06
        • 2013-04-20
        • 2016-03-14
        • 2014-02-22
        • 2017-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多