Это уже общепризнанный факт, что пароли по своей природе слабые . Таким образом, просьба конечных пользователей создавать надежные пароли для каждого приложения, которое они используют, просто усугубляет ситуацию.
Простой обходной путь — позволить пользователям проходить аутентификацию через свои существующие социальные учетные записи, такие как Facebook, Twitter, Google и т. Д. В этой статье мы собираемся сделать это и добавить эту возможность входа в социальную сеть в пример приложения Node, разработанного в первой части эта серия аутентификации, чтобы мы могли проходить аутентификацию через наши учетные записи Facebook и Twitter с использованием промежуточного программного обеспечения Passport .
Если вы еще не ознакомились с предыдущей статьей , я бы порекомендовал вам пройти ее, поскольку мы будем опираться на фундамент, заложенный в этой статье, и добавим в нее новые стратегии, маршруты и представления.
Социальный вход
Для непосвященных, социальный вход — это тип единого входа, использующий существующую информацию с сайтов социальных сетей, таких как Facebook, Twitter и т. Д., Где обычно ожидается, что у пользователей уже есть учетные записи.
Социальный вход в систему в основном основан на схеме аутентификации, такой как OAuth 2.0 . Чтобы узнать больше о различных потоках входа в систему, поддерживаемых OAuth, прочитайте эту статью . Мы выбираем Passport для управления социальным входом для нас, поскольку он предоставляет различные модули для различных поставщиков OAuth, будь то Facebook, Twitter, Google, GitHub и т. Д. В этой статье мы будем использовать модули passport-facebook и passport-twitter обеспечить функциональность входа через существующие учетные записи Facebook или Twitter.
Аутентификация на Facebook
Чтобы включить аутентификацию Facebook, сначала нужно создать приложение Facebook с помощью портала разработчиков Facebook . Запишите идентификатор приложения и секрет приложения и укажите URL-адрес обратного вызова, перейдя в « Настройки» и указав URL-адрес сайта в разделе « Веб-сайт » для приложения. Также не забудьте ввести действительный адрес электронной почты в поле Контактный адрес электронной почты . Требуется, чтобы иметь возможность сделать это приложение общедоступным и доступным для общественности.
Затем перейдите в раздел « Статус и обзор » и установите ползунок « Да», чтобы сделать приложение общедоступным. Мы создаем файл конфигурации, fb.js, для хранения этой информации о конфигурации, которая потребуется для подключения к Facebook.
1
2
3
4
5
6
|
// facebook app settings — fb.js
module.exports = {
‘appID’ : ‘<your_app_identifier>’,
‘appSecret’ : ‘<your_app_secret>’,
‘callbackUrl’ : ‘http://localhost:3000/login/facebook/callback’
}
|
Стратегия входа в Facebook
Вернувшись в наше приложение Node, мы теперь определяем стратегию паспорта для аутентификации в Facebook с помощью модуля FacebookStrategy , используя вышеуказанные настройки для получения профиля Facebook пользователя и отображения деталей в представлении.
1
|
passport.use(‘facebook’, new FacebookStrategy({ clientID : fbConfig.appID, clientSecret : fbConfig.appSecret, callbackURL : fbConfig.callbackUrl }, // facebook will send back the tokens and profile function(access_token, refresh_token, profile, done) { // asynchronous process.nextTick(function() { // find the user in the database based on their facebook id User.findOne({ ‘id’ : profile.id }, function(err, user) { // if there is an error, stop everything and return that // ie an error connecting to the database if (err) return done(err); // if the user is found, then log them in if (user) { return done(null, user); // user found, return that user } else { // if there is no user found with that facebook id, create them var newUser = new User(); // set all of the facebook information in our user model newUser.fb.id = profile.id; // set the users facebook id newUser.fb.access_token = access_token; // we will save the token that facebook provides to the user newUser.fb.firstName = profile.n
|
Настройка маршрутов
Теперь нам нужно добавить определенные маршруты для включения входа через Facebook и для обработки обратного вызова после того, как пользователь разрешил приложению использовать свою учетную запись Facebook.
01
02
03
04
05
06
07
08
09
10
11
12
13
|
// route for facebook authentication and login
// different scopes while logging in
router.get(‘/login/facebook’,
passport.authenticate(‘facebook’, { scope : ’email’ }
));
// handle the callback after facebook has authenticated the user
router.get(‘/login/facebook/callback’,
passport.authenticate(‘facebook’, {
successRedirect : ‘/home’,
failureRedirect : ‘/’
})
);
|
Страница входа в наше демонстрационное приложение выглядит следующим образом:
Когда вы нажмете кнопку « Войти через Facebook» , он попытается пройти аутентификацию через Facebook. Если вы уже вошли в Facebook, появится диалоговое окно, запрашивающее ваше разрешение, в противном случае вам будет предложено войти в Facebook, а затем отобразить это диалоговое окно.
Если вы разрешите приложению получать ваш общедоступный профиль и адрес электронной почты, то будет вызываться наша зарегистрированная функция обратного вызова с данными пользователя. Мы можем сохранить их для последующего использования, отобразить или просто игнорировать, в зависимости от того, что вы хотите делать с информацией. Не стесняйтесь забегать вперед во времени и проверить весь код в этом репозитории git .
Было бы хорошо отметить, что помимо базовой информации, которую предоставляет это демонстрационное приложение, вы можете использовать тот же механизм аутентификации для извлечения более полезной информации о пользователе, например, о списке его друзей, используя соответствующую область действия и используя API-интерфейсы Facebook с токен доступа, полученный с профилем пользователя.
Аутентификация в Твиттере
Аналогичный модуль аутентификации должен быть подключен для обработки аутентификации через Twitter, а Passport встроен, чтобы помочь с его модулем passport-twitter .
Во-первых, вам нужно создать новое приложение Twitter, используя его интерфейс управления приложениями . Здесь следует отметить одну вещь: при указании URL-адреса обратного вызова Twitter, похоже, не очень хорошо с ним работает, если в поле URL-адрес обратного вызова указано «localhost». Чтобы преодолеть это ограничение при разработке, вы можете использовать специальный адрес обратной связи или «127.0.0.1» вместо «localhost». После создания приложения запишите следующий ключ API и секретную информацию в файле конфигурации следующим образом:
1
2
3
4
5
6
|
// twitter app settings — twitter.js
module.exports = {
‘apikey’ : ‘<your_app_key>’,
‘apisecret’ : ‘<you_app_secret>’,
‘callbackUrl’ : ‘http://127.0.0.1:3000/login/twitter/callback’
}
|
Стратегия входа в Twitter
Стратегия входа в систему для Twitter является примером TwitterStrategy
и это выглядит так:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
passport.use(‘twitter’, new TwitterStrategy({
consumerKey : twitterConfig.apikey,
consumerSecret : twitterConfig.apisecret,
callbackURL : twitterConfig.callbackURL
},
function(token, tokenSecret, profile, done) {
// make the code asynchronous
// User.findOne won’t fire until we have all our data back from Twitter
process.nextTick(function() {
User.findOne({ ‘twitter.id’ : profile.id },
function(err, user) {
// if there is an error, stop everything and return that
// ie an error connecting to the database
if (err)
return done(err);
// if the user is found then log them in
if (user) {
return done(null, user);
} else {
// if there is no user, create them
var newUser = new User();
// set all of the user data that we need
newUser.twitter.id = profile.id;
newUser.twitter.token = token;
newUser.twitter.username = profile.username;
newUser.twitter.displayName = profile.displayName;
newUser.twitter.lastStatus = profile._json.status.text;
// save our user into the database
newUser.save(function(err) {
if (err)
throw err;
return done(null, newUser);
});
}
});
});
})
);
|
Настройка маршрутов
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
|
// route for twitter authentication and login
// different scopes while logging in
router.get(‘/login/twitter’,
passport.authenticate(‘twitter’)
);
// handle the callback after facebook has authenticated the user
router.get(‘/login/twitter/callback’,
passport.authenticate(‘twitter’, {
successRedirect : ‘/twitter’,
failureRedirect : ‘/’
})
);
/* GET Twitter View Page */
router.get(‘/twitter’, isAuthenticated, function(req, res){
res.render(‘twitter’, { user: req.user });
});
|
Теперь, чтобы проверить это, обязательно используйте http://127.0.0.1:
<port>
вместо использования http://localhost
:<port>
. Как мы уже упоминали выше, кажется, что существует проблема при обмене токенов с Twitter с «localhost» в качестве имени хоста. При нажатии на кнопку « Войти через Twitter» , как и ожидалось, он запрашивает согласие пользователя на разрешение этому приложению использовать Twitter.
Когда вы разрешаете приложению доступ к вашей учетной записи Twitter и к ограниченной информации, вызывается обработчик обратного вызова, зарегистрированный в стратегии входа в систему, который затем используется для хранения этих данных в серверной базе данных.
Вывод
И у вас это есть !! Мы успешно добавили логины Facebook и Twitter в наше примерное приложение без написания большого количества кода и обработки сложностей, связанных с механизмом аутентификации, позволяя Passport выполнять тяжелую работу. Подобные стратегии входа могут быть написаны для множества провайдеров, которые поддерживает Passport Код для всего приложения можно найти в этом репозитории git . Не стесняйтесь расширять его и использовать в своих проектах.