Бързо въведение в OAuth с помощта на Passport.js

Какво е OAuth?

OAuth (Open Authorization) е протокол за оторизация. Приложение на трета страна може да го използва за достъп до потребителски данни от сайт (като Google или Twitter), без да разкрива паролата им. Сайтове като Quora, Medium, AirBnb и много други предлагат удостоверяване чрез OAuth.

OAuth наистина улеснява живота ни, като премахва необходимостта да помним паролата на всеки акаунт, който създавате на почти всеки сайт. Трябва само да запомните основната парола за акаунт на вашия OAuth доставчик.

Какво е Passport.js?

Passport е междинен софтуер, който реализира удостоверяване на базирани на Express уеб приложения. Той осигурява над 500+ стратегии. Какви са тези стратегии? Стратегии се използват за удостоверяване на заявки. Всяка стратегия има свой собствен npm пакет (като паспорт-twitter, паспорт-google-oauth20). Преди използване трябва да бъде конфигурирана стратегия.

Защо да използваме Passport.js?

Ето шест причини, посочващи защо трябва да използвате Passport:

  • Той е лек
  • Лесно конфигурируем
  • Поддържа постоянни сесии
  • Предлага OAuth
  • Осигурява отделни модули за всяка стратегия
  • Дава ви възможност да прилагате персонализирани стратегии

Да построим нещо

За да започнем, трябва да инсталираме паспорт от NPM:

npm install passport 

Ще изградим просто приложение, което предоставя на потребителя достъп до таен маршрут само ако той влезе. Ще използвам стратегията паспорт-google-oauth20 в този урок. Чувствайте се свободни да използвате всяка друга стратегия, която предпочитате, но не забравяйте да проверите документите, за да видите как е конфигурирана.

Преди да продължим, се нуждаем от clientID и clientSecret. За да го получите, отидете на //console.developers.google.com и създайте нов проект. След това отидете на Enable APIs and Services и активирайте Google+ API. Изберете API и кликнете върху създаване на идентификационни данни.

Попълнете формуляра и използвайте един и същ URL адрес за обратно обаждане както във формуляра, така и във вашия файл. Не забравяйте да прочетете коментарите на кода, за да разберете как всичко си подхожда.

app.js

// Required dependencies const express = require('express'); const app = express(); const passport = require('passport'); const GoogleStrategy = require('passport-google-oauth20'); const cookieSession = require('cookie-session'); // cookieSession config app.use(cookieSession({ maxAge: 24 * 60 * 60 * 1000, // One day in milliseconds keys: ['randomstringhere'] })); app.use(passport.initialize()); // Used to initialize passport app.use(passport.session()); // Used to persist login sessions // Strategy config passport.use(new GoogleStrategy({ clientID: 'YOUR_CLIENTID_HERE', clientSecret: 'YOUR_CLIENT_SECRET_HERE', callbackURL: '//localhost:8000/auth/google/callback' }, (accessToken, refreshToken, profile, done) => { done(null, profile); // passes the profile data to serializeUser } )); // Used to stuff a piece of information into a cookie passport.serializeUser((user, done) => { done(null, user); }); // Used to decode the received cookie and persist session passport.deserializeUser((user, done) => { done(null, user); }); // Middleware to check if the user is authenticated function isUserAuthenticated(req, res, next) { if (req.user) { next(); } else { res.send('You must login!'); } } // Routes app.get('/', (req, res) => { res.render('index.ejs'); }); // passport.authenticate middleware is used here to authenticate the request app.get('/auth/google', passport.authenticate('google', { scope: ['profile'] // Used to specify the required data })); // The middleware receives the data from Google and runs the function on Strategy config app.get('/auth/google/callback', passport.authenticate('google'), (req, res) => { res.redirect('/secret'); }); // Secret route app.get('/secret', isUserAuthenticated, (req, res) => { res.send('You have reached the secret route'); }); // Logout route app.get('/logout', (req, res) => { req.logout(); res.redirect('/'); }); app.listen(8000, () => { console.log('Server Started!'); }); 

index.ejs

  • Login
  • Secret
  • Logout

Както можете да видите, ние създадохме /secretмаршрут и предоставяме достъп до него само ако потребителят е удостоверен. За да проверим дали потребителят е удостоверен, създадохме междинен софтуер, който проверява дали в заявката има потребителски обект. И накрая, за да излезем, използвахме req.logout()метода, предоставен от паспорта, за да изчистим сесията.

Ето някои ресурси, за да научите повече за паспорта

Официална документация на Passport.js

Просто, ненатрапчиво удостоверяване за Node.js www.passportjs.org

Заключение

Тук видяхме само една стратегия. Има още 500+. Силно препоръчвам да прегледате официалната документация на Passport и да разберете какво още предлагат. Благодарим ви, че отделихте време да прочетете това. Чувствайте се свободни да се свържете с мен в LinkedIn, Twitter и GitHub. Желая ви късмет!

Предишна статия

Бързо въведение в Материалния дизайн с помощта на Materialize

Какво е материален дизайн? medium.freecodecamp.org