使用OAuth 1.0a API通过LinkedIn进行身份验证的Passport策略在保存用户

时间:2017-07-25 12:12:05

标签: node.js mongodb oauth passport.js

我是node.js开发的初学者,并尝试构建基于Express框架的应用程序。我实施了护照本地护照-facebook和passport-linkedin,供用户注册并登录应用程序,以及将多个社交帐户链接到mongoDb中的单个用户帐户(来自此tutorial)。

我的问题是,当使用passport-linkedin时,我总是会收到未定义的电子邮件字段,即使我可以使用经过正确身份验证的用户获取名字和姓氏。

passport.js

passport.use(new LinkedinStrategy({
consumerKey     : configAuth.linkedinAuth.consumerKey,
consumerSecret  : configAuth.linkedinAuth.consumerSecret,
callbackURL     : configAuth.linkedinAuth.callbackURL,
passReqToCallback : true // allows us to pass in the req from our route (lets us check if a user is logged in or not)
},
  function(req, token, tokenSecret, profile, done) {
  // asynchronous
  process.nextTick(function() {
   // check if the user is already logged in
   if (!req.user) {
    User.findOne({ 'linkedin.id' : profile.id }, function(err, user) {
    if (err)
        return done(err);
      if (user) {
        // if there is a user id already but no token (user was linked at one point and then removed)
        if (!user.linkedin.token) {
        [...]
        } else {
         // if there is no user, create them
         var newUser                  = new User();
         newUser.linkedin.id          = profile.id;
         newUser.linkedin.token       = token;
         newUser.linkedin.firstname   = profile.name.givenName;
         newUser.linkedin.lastname    = profile.name.familyName;
         newUser.linkedin.email       = profile.emails;
         newUser.save(function(err) {
            if (err)
                return done(err);
            return done(null, newUser);
         });
        }
      });
    } else {
    // user already exists and is logged in, we have to link accounts
    [...]
  }
 });
}));

路由/ accounts.js

// linkedin --------------------------------
// send to linkedin to do the authentication
app.get('/auth/linkedin', passport.authenticate('linkedin', { scope: ['r_basicprofile', 'r_emailaddress'] }));

// handle the callback after linkedin has authenticated the user
app.get('/auth/linkedin/callback',
  passport.authenticate('linkedin', {
    successRedirect : '/profile', // redirect to the secure profile section
    failureRedirect : '/signup', // redirect back to the signup page if there is an error
    failureFlash : true // allow flash messages
}));

我可以通过查看Passport-LinkedIn / lib / strategy.js找到保存到我的用户数据库中的名字和姓氏,然后我对profile.emails做了同样的事情仍然保留了#34; undefined"在确认用户之后。

提前感谢您的帮助。

编辑:来自LinkedIn开发者常见问题解答

  

虽然我们尚未宣布正式弃用OAuth 1.0a   结合LinkedIn的API,我们不再积极鼓励或   支持它的使用。

     

使用OAuth 1.0a构建的现有应用程序将继续使用   功能正常,直到我们正式公布它为止   日落。

     

强烈建议所有人使用或转换到OAuth 2.0   应用

1 个答案:

答案 0 :(得分:0)

一段时间以前有同样的问题,现在让它运转起来。你试过oauth2了吗?如果您已经实施了passport-linkedin,那么这应该是对passport.js文件的微小更改。 LinkedIn弃用了OAuth 1.0,因此可能会导致某些问题导致检索某些信息。我猜你也面临同样的情况。试试这个,你应该好好去!