2015-11-16 3 views
2

Я использую модуль паспорта для аутентификации пользователя и создания токена jwt.От токена facebook до токена jwt

Теперь я хочу сделать доступ в facebook возможным. Я нахожусь в фазе, когда получаю токен fb и идентификатор facebook.

Что я должен делать с этой информацией? В настоящее время я создаю нового пользователя, у которого есть переменная с идентификатором facebook, но без пароля.

Без пароля я не могу создать токен jwt, поэтому я не могу войти.

Как это работает?

Мой передний конец является угловым, и мой API написан с помощью nodejs, express & mongoose.

код паспорта:

passport.use(new LocalStrategy(
    function(username, password, done) { 
     User.findOne({ username: username }, function (err, user) { 
      if (err) { return done(err); } 
      if (!user) { 
       return done(null, false, { message: 'Incorrect username.' }); 
      } 
      if (!user.validPassword(password)) { 
       return done(null, false, { message: 'Incorrect password.' }); 
      } 
      return done(null, user); 
     }); 
    } 
)); 

код generatejwt:

UserSchema.methods.generateJWT = function() { 

    // set expiration to 60 days 
    var today = new Date(); 
    var exp = new Date(today); 
    exp.setDate(today.getDate() + 60); 

    return jwt.sign({ 
     _id: this._id, 
     username: this.username, 
     exp: parseInt(exp.getTime()/1000), 
    }, 'SECRET'); 
}; 

ответ

0

Вам нужно создать 2 маршрута:

1) Это будет называться для входа в Facebook.

2) Обратный маршрут, если аутентификация пользователя прошла успешно. (Обратный вызов маршрут должен быть зарегистрирован на портале для разработчиков facebook.

//Facebook Login 
app.route('/auth/facebook') 
.get(passport.authenticate('facebook', { scope: 'email' })); 
// Callback 
app.route('/auth/facebook/callback') 
.get(passport.authenticate('facebook'),users.generateJWT); 

Определение стратегии facebook, который будет хранить информацию о пользователе (идентификатор, маркер , электронная почта) в базе данных

var facebookStrategy = new FacebookStrategy({ 
clientID: cfg.facebook.clientID, 
clientSecret: cfg.facebook.clientSecret, 
callbackURL: cfg.facebook.callbackURL, 
profileFields: ['id', 'email', 'first_name', 'last_name'] 
}, 
function(token, refreshToken, profile, done) { 
    console.log("Token: "+ token); 
    console.log("RefreshToken: "+ refreshToken); 
    console.log("profile: "+ profile); 
    process.nextTick(function() { 
    User.findOne({ 'facebook.id': profile.id }, function(err, user) { 
    if (err) 
     return done(err); 
    if (user) { 
     console.log("User Found"); 
     return done(null, user); 
    } else { 
     console.log("Creating user"); 
     var newUser = new User(); 
     console.log("Token: "+ token); 
     newUser.facebook.id = profile.id; 
     newUser.facebook.token = token; 
     newUser.facebook.name = profile.name.givenName + ' ' + profile.name.familyName; 
     newUser.facebook.email = (profile.emails[0].value || '').toLowerCase(); 

     newUser.save(function(err) { 
     if (err) 
      throw err; 
     return done(null, newUser); 
     }); 
    } 
    }); 
}); 
}); 

в контроллере, написать следующий код для обратного вызова маршрута:

/** 
* Generate JWT Token 
*/ 
exports.generateJWT = function(req, res) { 
var token; 
      token = req.user.generateJwt(); 
      res.status(200); 
      res.json({ 
       "token" : token 
       }); 
    }; 
Смежные вопросы