Опять же, мы говорим о технологии, используемой на 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}
Довольно просто!
Знаете ли вы какие-либо другие решения? более эффективным?
Благодаря!