Статьи

OAuth-аутентификация с Passport.js и интеграция с Jade

Опять же, мы говорим о технологии, используемой на www.parkuik.com (вы еще не зарегистрированы?; P)

Хотя простая регистрация с использованием имени пользователя и пароля действительно важна (что я и сделаю в ближайшее время), в настоящее время более важно предоставить пользователям доступ к веб-сайту через провайдеров OAuth, таких как Facebook или Twitter. Их много, но, конечно, эти двое наиболее известны.

Прежде всего, я должен сказать, что в мире node.js есть два основных варианта включения входа OAuth: Passport.js и Everyauth . Эти два являются допустимыми вариантами, но я должен сказать, что я начал с каждого месяца назад, и это было очень глючно. Я не знаю, как это сейчас, но если мне придется рассказать вам об одном из них, я пойду с passport.js (который включает OAuth и простую регистрацию).

Поэтому, прежде всего, вам необходимо зарегистрировать свое приложение у всех поставщиков OAuth, которых вы хотите использовать. Это отличается для каждого поставщика, поэтому просто зайдите на его сайт и попробуйте. Все довольно просто =).

Как только вы это сделаете, у вас будет два ключа. В зависимости от провайдера OAuth они будут называться по-разному. Facebook использует appId и appSecret, Twitter использует consumerKey и consumerSecret, Github использует appId и appSecret и т. Д.

Теперь установите паспорт на свой проект:

     
npm install passport

Это не единственное, что вам нужно установить. Для каждого oauth-провайдера, с которым вы хотите работать, вы должны установить его модуль. Для Facebook, паспорта-Facebook, для Twitter, паспорта-Twitter и т. Д.

npm instal passport-twitter
npm instal passport-facebook

Прежде всего, я привык включать эти ключи токенов oauth или «как хотите» для их вызова в отдельный файл, избегая смешивания его со всем приложением:

var ids = {
  fb: {
    appId: '...',
    appSecret: '...'
  },
  twit: {
    consumerKey: '...',
    consumerSecret: '...'
  },
  github: {
    appId: '...',
    appSecret: '...'
  },
  instagram: {
    clientId: '...',
    clientSecret: '...'
  }
}

Вы должны настроить свое приложение и маршруты для использования OAuth. Это должно быть сделано в основном файле, который я обычно называю app.js. Это можно сделать следующим образом (я публикую только решение для Twitter, потому что другие провайдеры делают то же самое):

var conf = require('./config/oauth_providers.js')
app.configure(function(){
  ...
  app.use(express.session({secret: "ihauyd6tqwueuhet7dwqyqwhiwqhuyiod"}));
  app.use(passport.initialize());
  app.use(passport.session());
});
passport.use(new TwitterStrategy({
    consumerKey: conf.twit.consumerKey,
    consumerSecret: conf.twit.consumerSecret,
    callbackURL: callbackURL('twitter')
  },
  function(token, tokenSecret, profile, done) {
    var User = mongoose.model('User');
    User.findOne({providerId: profile.id},
      function(err, user) {
        if (!err && user != null) {
          var ObjectId = mongoose.Types.ObjectId;
          User.update({"_id": user["_id"]}, { $set: {lastConnected: new Date()} } ).exec();
        } else {
          var userData = new User({
            provider: profile.provider,
            providerUsername: profile.username,
            providerId: profile.username + ":" + profile.id,
            created: Date.now(),
            oauthToken: token,
            username: profile.displayName,
            profilePicture: 'https://api.twitter.com/1/users/profile_image?screen_name=' + profile.username +'&size=bigger'
          });
          userData.save(function(err) {
            if (err) console.log(err);
            else console.log('Saving user...');
          });
        }
      }
      );
      var user = { id: profile.id, name: profile.username });
      done(null, user);
  }
));

И теперь мы должны определить наши обратные вызовы и маршруты. Это включает в себя всю работу по вставке пользователей и получения их из базы данных.

app.get('/auth/twitter', passport.authenticate('twitter'), {scope: 'email'});
app.get('/auth/facebook', passport.authenticate('facebook', {scope: 'email'}));
app.get('/auth/twitter/callback',
  passport.authenticate('twitter', { successRedirect: '/main',
                                    failureRedirect: '/auth/twitter'})
);
app.get('/auth/facebook/callback',
  passport.authenticate('facebook', { successRedirect: '/main',
                                    failureRedirect: '/auth/facebook'})
);
app.get('/logout', isAuthenticated, function(req, res) {
  req.logOut();
  res.redirect('/');
});

Здесь я использую Mongoose для работы с базой данных MongoDB, но, конечно, вы можете использовать все, что захотите.

Как вы можете видеть на маршрутах, определенных в express, / logout используется для выхода пользователя из системы. Итак, просто поместите ссылку на выход из системы, и все будет готово.

Другие вещи, которые вы можете сделать? определите функцию «isAuthenticated» (вы должны найти решение, которое работает для вас) и использовать его таким образом для доступа к защищенным ресурсам:

     
app.put('/parkings/:id', isAuthenticated, routes.parkings.putParking);

Или вы можете определить herlpers для использования переменных в ваших шаблонах Jade:

var helpers = {};
helpers.auth = function(req, res) {
    var map = {};
    map.isAuthenticated = req.isAuthenticated();
    map.user = req.user;
    return map;
}
app.dynamicHelpers(helpers);

Если вы хотите использовать его в шаблоне Jade, просто назовите его так:

     
#{auth.isAuthenticated}

Довольно просто!

Знаете ли вы какие-либо другие решения? более эффективным?

Благодаря!