MEAN Stack - uwierzytelnienie

Podobne dokumenty
MEAN Stack - uwierzytelnienie

Kontrola sesji w PHP HTTP jest protokołem bezstanowym (ang. stateless) nie utrzymuje stanu między dwoma transakcjami. Kontrola sesji służy do

Kontrola sesji w PHP HTTP jest protokołem bezstanowym (ang. stateless) nie utrzymuje stanu między dwoma transakcjami. Kontrola sesji służy do

INTERNETOWE BAZY DANYCH materiały pomocnicze - wykład VII

Języki programowania wysokiego poziomu. PHP cz.3. Formularze

Sesje i logowanie. 1. Wprowadzenie

Sesje, ciasteczka, wyjątki. Ciasteczka w PHP. Zastosowanie cookies. Sprawdzanie obecności ciasteczka

Ćwiczenie: JavaScript Cookies (3x45 minut)

Cookie Policy. 1. Informacje ogólne.

Serwis realizuje funkcje pozyskiwania informacji o użytkownikach i ich zachowaniach w następujący sposób:

Polityka prywatności serwisu

Cemarol Sp. z o.o. Polityka prywatności (pliki cookies) 1. Informacje ogólne.

Sprawozdanie nr 4. Ewa Wojtanowska

The OWASP Foundation Session Management. Sławomir Rozbicki.

Polityka prywatności dla strony ELCEN Sp. z o.o. z siedzibą w Gdyni

POLITYKA PRYWATNOŚCI SERWIS:

Sklep internetowy wtspartner.pl dokłada wszelkich starań, aby prowadzony serwis ułatwiał każdemu użytkownikowi

Express.js i własne API - pomoc do lab02

Programowanie komponentowe. Przykład 1 Bezpieczeństwo wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

Programowanie w Sieci Internet Python - c. d. Kraków, 28 listopada 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Modele uwierzytelniania, autoryzacji i kontroli dostępu do systemów komputerowych.

Stosowanie ciasteczek (cookies)

Dokumentacja smsapi wersja 1.4

Gatesms.eu Mobilne Rozwiązania dla biznesu

Internetowe bazy danych

Polityka prywatności w serwisie internetowym IPN

Bezpieczeństwo systemów komputerowych

Tworzenie witryn internetowych PHP/Java. (mgr inż. Marek Downar)

Django : praktyczne tworzenie aplikacji sieciowych / Antonio Mele. Gliwice, cop Spis treści

ZASADY KORZYSTANIA Z PLIKÓW COOKIES ORAZ POLITYKA PRYWATNOŚCI W SERWISIE INTERNETOWYM PawłowskiSPORT.pl

Danych Osobowych oświadcza, że za wyjątkiem sytuacji uregulowanych w prawie polskim dane dotyczące IP oraz cookies nie będą przekazywane osobom

POLITYKA PRYWATNOŚCI

Dokumentacja wstępna TIN. Rozproszone repozytorium oparte o WebDAV

Tworzenie stron internetowych z wykorzystaniem HTM5, JavaScript, CSS3 i jquery. Łukasz Bartczuk

Jarosław Kuchta Administrowanie Systemami Komputerowymi. Internetowe Usługi Informacyjne

Podręcznik Integracji

II. PRZETWARZANIE DANYCH OSOBOWYCH:

Wprowadzenie do Internetu Zajęcia 5

Aktualizacja SMSFall v Data publikacji:

I.Wojnicki, PHP. PHP PHP Hypertext Preprocessor. Igor Wojnicki. Ktedra Informatyki Stosowanej Akademia Górniczo-Hutnicza w Krakowie.

Aplikacje www laboratorium

I.Wojnicki, Tech.Inter.

POLITYKA PRYWATNOŚCI ORAZ POLITYKA PLIKÓW COOKIES W Sowa finanse

Polityka Prywatności i Cookies

Ciasteczka. Krishna Tateneni Jost Schenck Polskie tłumaczenie: Suse Polska Aktualny opiekun tłumaczenia: Marcin Kocur

Internetowe bazy danych

11. Autoryzacja użytkowników

Aplikacje internetowe - laboratorium

POLITYKA PRYWATNOŚCI

Zagrożenia trywialne. Zagrożenia bezpieczeństwa aplikacji internetowych. Parametry ukryte. Modyfikowanie parametrów wywołania

Programowanie w Internecie

Jednym z najważniejszych zagadnień, z którym może się zetknąć twórca

Obowiązek informacyjny RODO

Języki skryptowe - PHP. PHP i bazy danych. Paweł Kasprowski. pawel@kasprowski.pl. vl07

(Pluggable Authentication Modules). Wyjaśnienie technologii.

Referat z przedmiotu Technologie Internetowe SPIS TREŚCI

Plan. Stan sesji (1/2) Stan sesji (2/2) Stan sesji Tworzenie przycisku Integracja prostego formularza z raportem Tworzenie formularza z raportem

EXSO-CORE - specyfikacja

Dokumentacja interfejsu HTTPD. Platforma BSMS.PL Instrukcja podłączenia po przez http

Telesprzedaż by CTI Instrukcja

Baza danych do przechowywania użytkowników

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Dokumentacja Skryptu Mapy ver.1.1

Aplikacje webowe w obliczu ataków internetowych na przykładzie CodeIgniter Framework

POLITYKA PRYWATNOŚCI

Co to jest NODE.JS? Nowoczesne środowisko programistyczne

POLITYKA PRYWATNOŚCI Opisuje zasady przetwarzania przez nas informacji na Twój temat, w tym danych osobowych oraz ciasteczek, czyli tzw. cookies.

POLITYKA COOKIES SERWISU CARDINA.PL

Platforma e-learningowa

Specyfikacja instalacji usługi SMS Premium w Przelewy24.pl

MEAN Stack - Node.js, express

Instrukcja użytkownika. Aplikacja dla WF-Mag

1 Ochrona Danych Osobowych

Polityka prywatności oraz plików cookies

Wykład 4. Metody uwierzytelniania - Bezpieczeństwo (3) wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

MATERIAŁY DYDAKTYCZNE. Streszczenie: Z G Łukasz Próchnicki NIP w ramach projektu nr RPMA /15

MEAN Stack - Mongoose, obsługa poczty elektornicznej

Kurs rozszerzony języka Python

Aplikacje webowe z wykorzystaniem Node.js oraz Express

Polityka cookies i podobnych technologii

Wdrożenie modułu płatności eservice. dla systemu Zen Cart

Serwery aplikacji. dr Radosław Matusik. radmat

Polityka Cookies. 1 Definicje. Administrator oznacza przedsiębiorstwo

PRZEPUSTNICA CHEMOODPORNA ZWROTNA (GRAWITACYJNA) Ø400 / SRV400P

Fundacja Ośrodka KARTA z siedzibą w Warszawie, przy ul. Narbutta 29 ( Warszawa),

Laboratorium 7 Blog: dodawanie i edycja wpisów

Wykorzystywanie plików cookies

Zasady Wykorzystywania Plików Cookies

SMS Kod Automatyczny

POLITYKA PRYWATNOŚCI Konkurs wiedzy dermatologicznej dla lekarzy

Przykład opisu cookies

Aplikacje WWW - laboratorium

Instrukcja logowania do systemu Rejestru Unii dla nowych użytkowników

Polityka prywatności Spółdzielni Mieszkaniowej Słoneczny Stok

POLITYKA PRYWATNOŚCI

Transkrypt:

EAN Stack - uwierzytelnienie 1/45 MEAN Stack - uwierzytelnienie Tworzenie serwisów Web 2.0 dr inż. Robert Perliński rperlinski@icis.pcz.pl Politechnika Częstochowska Instytut Informatyki Teoretycznej i Stosowanej 5 listopada 2018

MEAN Stack - uwierzytelnienie 2/45 Plan prezentacji 1 MEAN Stack, ExpressJS - logowanie 2 Obsługa sesji w express 3 Uwierzytelnienie i autoryzacja 4 Uwierzytelnienie z passport Instrukcja krok po kroku 5 Tutoriale 6 Źródła

MEAN Stack MEAN Stack - uwierzytelnienie 3/45

MEAN Stack - uwierzytelnienie 4/45 ExpressJS i warstwy pośrednie ExpressJS to komplenty framework. Działa z szablonami (jade, ejs, handlebars, hogan.js) i kompilatorami CSS (less, stylus, compass). Dzięki wartstwom pośredniczącym (oprogramowanie pośredniczące) obsługuje również: ciasteczka, sesje, buforowanie, CSRF, kompresję i wiele innych. Oprogramowanie pośredniczące: łańcuch/stos programów przetwarzających każde żądanie do serwera. Takich programów w stosie może być dowolna liczba, przetwarzanie odbywa się jeden po drugim. Niektóre z nich mogą zmieniać żądanie, tworzyć logi czy inne dane, przekazywać je do następnych (next()) programów w strumieniu.

MEAN Stack - uwierzytelnienie 5/45 Express-middlewares Warstwy pośredniczące dodajemy do ExpressJS używając app.use dla dowolnej metody albo app.verb (np. app.get, app.delete, app.post, app.update,...)

MEAN Stack - uwierzytelnienie 6/45 Sesja przeglądarki - bezstanowość HTTP Protokół HTTP jest protokołem bezstanowym. Nie posiada wbudowanego sposobu utrzymywania stanu pomiędzy dwiema transakcjami. Kiedy użytkownik żąda jednej strony, a później następnej, HTTP nie jest w stanie określić, czy oba żądania pochodzą od tego samego użytkownika. Ideą kontroli sesji jest zapewnienie możliwości śledzenia użytkownika podczas pojedynczej sesji w witrynie WWW. Umożliwia ona dokonanie wielu operacji: łatwą obsługę logowania użytkowników, wyświetlanie zawartości zależnie od poziomu uwierzytelnienia lub osobistych preferencji, śledzenie zachowań użytkownika, zaimplementowanie koszyków na zakupy itd.

MEAN Stack - uwierzytelnienie 7/45 Sesja przeglądarki Sesja zapamiętuje przez pewien czas na serwerze szczegóły dotyczące połączenia z klientem. W uproszczeniu to tablica zmiennych, przypisywanych do sesji przeglądarki. Otwarcie strony w przeglądarce powoduje utworzenie przez serwer sesji i załadowanie najnowszej wersji strony. Do przeglądarki wysyłane jest ciasteczko z unikalnym numerem sesji. Zmienne są przechowywane po stronie serwera. Identyfikator sesji jest jedyną informacją widoczną po stronie klienta.

Sesja przeglądarki MEAN Stack - uwierzytelnienie 8/45

MEAN Stack - uwierzytelnienie 9/45 Sesje w express Pakiet express-session Tworzy warstwę pośrednią według podanych opcji: session(opcje) Dane sesyjne same z siebie nie są zapisywane w ciasteczkach, zapisywane jest tylko ID sesji. Dane sesyjne przechowywane są po stronie serwera. Domyślnie dane są przechowywane w pamięci serwera (MemoryStorage) - jest to rozwiązanie tylko do tworzenia aplikacji, nie do wersji produkcyjnej. Właściwe metody przechowywania danych sesyjnych opierają się na osobnych modułach, głównie na bazach danych: connect-mongo - Zapis sesji w oparciu o MongoDB connect-pg-simple - Sesje w oparciu o PostgreSQL connect-sqlite3 - Sesja z użyciem SQLite3... session-file-storage - Sesje zapisywane w systemie plików

MEAN Stack - uwierzytelnienie 10/45 Opcje sesji Opcje tworzenia danych sesyjnych: cookie - ustawienia dla ciasteczka session ID, wartość domyślna: { path: /, httponly: true, secure: false, maxage: null } path - ścieżka dla domeny, której będzie dotyczyło ciasteczko, domyślna wartość to / czyli cała domena, secure - domyślnie jest false, jeśli true, to wymaga to połączenia po HTTPS, jeśli serwer nie obsługuje HTTPS to klient nie wyśle później ciasteczka do serwera, maxage - liczba milisekund do utraty ważności ciasteczka, domyślnie jest null czyli sesja jest na okres życia przeglądarki, httponly - wartość true nie pozwala na dostęp do ciasteczek z posiomu JavaScript przeglądarki, domain - określa wartość domeny dla ciasteczka, domyślnie nieustawione - przeglądarki uznają, że ciasteczko odnosi się do bieżącej domeny, expires - określa datę ważności ciasteczka, domyślnie nieustawione - większość przeglądarek uzna, że cisteczko jest tylko na okres życia sesji,

MEAN Stack - uwierzytelnienie 11/45 Opcje sesji Opcje tworzenia danych sesyjnych: genid - określa funkcję wykorzystywaną do generowania ID sesji; funkcja powinna zwracać string, który będzie użyty jako session ID; domyślna funkcja używa biblioteki uid-safe app.use(session({ genid: function(req) { return genuuid() // use UUIDs for session IDs }, secret: 'jakies haslo' })) name - nazwa ciasteczka zawierającego ID sesji, które ustawiamy w odpowiedzi (res) albo odczytujemy w żądaniu (req); domyślna wartość: connect.sid, przy wielu aplikacjach na tym samym serwerze (ta sama nazwa hosta) trzeba używać różnych nazw

MEAN Stack - uwierzytelnienie 12/45 Opcje sesji Opcje tworzenia danych sesyjnych: proxy - zaufaj serwerowi proxy przy tworzeniu bezpiecznych ciasteczek (przez nagłówek X-Forwarded-Proto ); wartość domyślna: undefined, możliwe wartości: true - nagłówek X-Forwarded-Proto będzie użyty, false - wszystkie nagłówki są ignorowane, połączenie jest uważane za bezpieczne tylko jeśli jest bezpośrednie połączenie TSL/SSL undefined - używa ustawienia trust proxy z express a resave - wymusza zapisanie sesji, nawet jeśli nie była modyfikowana podczas żądania; wartość domyślna: true, zwykle ustawiana na false. rolling - wymusza ustawienie ciasteczka z ID sesji przy każdej odpowiedzi serwera; ważność ciasteczka jest odświerzana na maxage (resetowanie jej wartości); domyślna wartość: false,

MEAN Stack - uwierzytelnienie 13/45 Opcje sesji Opcje tworzenia danych sesyjnych: saveuninitialized - wymusza zapis niezainicjowanej sesji czyli takiej, która jest nowa i nie została jeszcze zmodyfikowana, domyślna wartość: true, wartość false dobrze sprawdza się przy sesji związanej z logowaniem, secret - wymagana opcja, sekret używany do oznaczenia ciasteczka z ID sesji; może być pojedyńczym obiektem string albo tablicą, store - określa sposób przechowywania sesji, domyślnie MemoryStore, unset - określa postępowanie przy wyczyszczeniu req.session: destroy - sesja będzie usunięta po zakończeniu odpowiedzi na żądanie, keep - domyślna wartość, sesja będzie zachowana ale zmiany wykonane w trakcie zapytania zostaną pominięte.

MEAN Stack - uwierzytelnienie 14/45 Trwała sesja Ciasteczka: ciasteczka sesyjne - trwają dopóki nie wyłączy się przeglądarki, ciasteczka trwałe - zostają po zamknięciu przeglądarki, mają określony czas ważności, można je usunąć ręcznie, oprócz informacji o zalogowaniu użytkownika przechowują ustawienia, np. jezyk, styl strony,... Trwała sesja (ang. session presistence): nie kończy się po zamknięciu przeglądarki (a to jest domyślne zachowanie). towrzy się przez ustawienie cookie.maxage, np.: app.use(session({ secret: 'w4d93k', cookie: { maxage: 24*60*60*1000 }})); zapamiętanie stanu pracy użytkownika z jakiejś aplikacji w ciasteczkach albo w bazie danych, przy ponownym logowaniu stan pracy jest przywracany.

Ciasteczko sesyjne MEAN Stack - uwierzytelnienie 15/45

MEAN Stack - uwierzytelnienie 16/45 Używanie express-session Instalacja: npm install express-session var session = require('express-session'); app.use(session({ secret: 'tajny kod', cookie: { maxage: 60000 }, resave: false, saveuninitialized: true })) app.get('/licznik', function(req, res, next) { var sesja = req.session; // Dostęp do sesji po req.session console.log(req.session.id); if (sesja.odwiedziny) { sesja.odwiedziny++ res.setheader('content-type', 'text/html') res.write('<p>odwiedziny: ' + sesja.odwiedziny + '</p>') res.write('<p>utrata ważności po: ' + (sesja.cookie.maxage / 1000) + ' s</p>') res.end() } else { sesja.odwiedziny = 1 res.end('przykład wykorzystania sesji. Odśwież stronę!') } })

MEAN Stack - uwierzytelnienie 17/45 Dane sesji Pole req.session: umożliwia dostęp do danych sesji, przy składowaniu jest serializowane do JSONa - można składować zagnieżdżone obiekty. req.session.id - unikalne ID związane z sesją - nie można go modyfikować. // req.sessionid - dostęp do ID sesji, pole tylko do odczytu. req.session.cookie - unikalne ciasteczko związane z sesją. Można modyfikując je dostosować sesję do różnych użytkowników, np. zmienić req.session.cookie.expires albo req.session.cookie.maxage: var hour = 3600000 req.session.cookie.expires = new Date(Date.now() + hour) req.session.cookie.maxage = hour

MEAN Stack - uwierzytelnienie 18/45 Metody związane z sesją Metody modyfikujące bieżącą sesję: Session.regenerate() - tworzy ponownie sesję dla danego żądania, Session.destroy() - usuwa bieżącą sesję, Session.reload() - ponownie wczytuje dane sesji, Session.save() - zapisuje dane sesji, Session.touch() - aktualizuje pole maxage. Metody do przechowywania sesji: store.all(callback) - pobiera wszystkie zapisane sesje jako tablicę, store.destroy(sid, callback) - usuwa wybraną sesję, store.clear(callback) - usuwa wszystkie zachowane sesje, store.length(callback) - zwraca liczbę wszystkich zachowanych sesji, store.get(sid, callback) - pobiera wybraną sesję, store.set(sid, session, callback) - nadpisuje wybraną sesję.

MEAN Stack - uwierzytelnienie 19/45 Uwierzytelnienie i autoryzacja Uwierzytelnienie (ang. authentication) - proces polegający na potwierdzeniu zadeklarowanej tożsamości podmiotu biorącego udział w procesie komunikacji. Celem uwierzytelniania jest uzyskanie określonego poziomu pewności, że dany podmiot jest w rzeczywistości tym, za który się podaje. Autoryzacja (ang. authorization) proces nadawania podmiotowi uprawnień do danych.

MEAN Stack - uwierzytelnienie 20/45 Uzyskiwanie dostępu do zasobów Uzyskiwanie dostępu do chronionych zasobów: Identyfikacja - podmiot deklaruje swoją tożsamość, np. w procesie logowania do serwera użytkownik podaje nazwę (login), serwer jest stroną ufającą. Uwierzytelnienie - strona ufająca stosuje odpowiednią technikę uwierzytelnienia w celu weryfikacji zadeklarowanej wcześniej torzsamośći, np. serwer prosi o wpisanie hasła (lub wskazanie pliku klucza) i weryfikuje zgodność z wpisaną wcześniej nazwą. Autoryzacja - potwierdzenie czy podmiot jest uprawniony do uzyskania dostępu do żądanego zasobu. Na tym etapie podmiot jest już uwierzytelniony, sprawdzamy jednak czy ma prawo dostępu do konkretnego zasobu, np. sewer weryfikuje uprawnienia zalogowanego użytkownika do konkretnego pliku czy podstrony internetowej.

MEAN Stack - uwierzytelnienie 21/45 Uwierzytelnienie w express - passport http://passportjs.org/ Cechy uwierzytelnienia z passport: proste i dyskretne (nie rzucające się w oczy), działa na bazie wartsty pośredniej w Node.js, bardzo elastyczne, zawiera budowę modułową, można je łatwo zastosować w każdej aplikacji używającej express a, zawiera kompletny zbiór strategi pozwalający na autoryzację: przy użyciu loginu i hasła przy użyciu autoryzacji ze znanych portali: Facebook, Twitter, google, github, linkedin,... (ponad 500 różnych strategii uwierzytelnienia do wykorzystania)

MEAN Stack - uwierzytelnienie 22/45 Uwierzytelnienie w express - passport Passport: nie wymaga podłączania z góry określonych tras (routes) nie wymaga jakiegoś konkretnego schematu bazy danych jest bardzo elastyczny, kod jest czysty i zarządzalny, co pozwala na umieszczenie go w aplikacji zgodnie z wolą programisty. API w passport jest proste: programista dostarcza żądanie, które należy uwierzytelnić passport dostarcza wstawki programowe (ang. hooks) kontrolujące czy uwierzytelnienie się powiodło. $ npm install passport

MEAN Stack - uwierzytelnienie 23/45 Cechy passport Cechy passport: ma służyć tylko autoryzacji, nie zajmuje się niczym więcej, obsługa pojedyńczej autoryzacji z OpenID czy OAuth, łatwa obsługa udanego i nieudanego logowania, wsparcie dla trwałych sesji, dynamiczny zasięg i uprawnienia, możliwość implementacji własnej strategii, lekki (mało kodu bazowego), passport wszystkie inne funkcjonalności przekazuje aplikacji...

MEAN Stack - uwierzytelnienie 24/45 Uwierzytelnienie w passport Różne współczesne metody uwierzytelnienia: tradycyjna: podajemy nazwę użytkownika i hasło związana z portalami społecznościowymi: pojedyncze logowanie dzięki OAuth; serwisy jak Facebook czy Twitter udostępniaja takie uwierzytelnienie, Serwisy udostępniające API często wymagają poświadczenia dostępu odpowiednim tokenem (żeton, dowód, znak). Elastyczność Każda aplikacja ma inny system uwierzytelnienia. Mechanizmy uwierzytelnienia, znane jako strategie, są udostępniane jako osobne moduły. Aplikacja wybiera, które strategie autoryzacji chce udostępniać.

MEAN Stack - uwierzytelnienie 25/45 Uwierzytelnienie wbudowane w passport Złożony proces uwierzytelnienia ale prosty kod. Uwierzytelnienie z przekierowaniem: app.post('/login', passport.authenticate('local', { successredirect: '/', failureredirect: '/login' }) ); Uwierzytelnienie z funkcją: app.post('/login', passport.authenticate('local'), function(req, res) { // Funkcja się wywoła jeśli użytkownik się uwierzytelnił // req.user zawiera dane uwierzytelnionego użytkownika res.send('### Użytkownik uwierzytelniony ###'); });

MEAN Stack - uwierzytelnienie 26/45 Własna funkcja do uwierzytelnienia w passport Jeśli wbudowane funkcje są niewystarczające, można dostarczyć własną funkcję obsługującą poprawne i błędne uwierzytelnienie: app.post('/login', function(req, res, next) { passport.authenticate('local', function(err, user, info) { if (err) { return next(err); } if (!user) { return res.redirect('/login'); } req.login(user, function(err) { if (err) { return next(err); } return res.send('użytkownik uwierzytelniony - logowanie OK'); }); })(req, res, next); }); Mamy dostęp do żądania i odpowiedzi (req i res). Brak uwierzytelnienia - user jest ustawiony na false. Jest uwierzytelnienie - ręcznie musimy się zalogować req.login() i wysłać odpowiedź czy zrobić przekierowanie.

MEAN Stack - uwierzytelnienie 27/45 Wykorzystanie passport Wykorzystanie passport krok po kroku: 1 Instalacja potrzebnych pakietów. 2 Przygotowanie bazy danych. 3 Wybór strategii, np. passport-local. 4 Ustawienie warstwy pośredniej. 5 Obsługa sesji (opcjonalnie). 6 Uwierzytelnienie + logowanie (z obsługą sesji lub bez). 7 Weryfikacja uwierzytelnienia użytkownika (opcjonalnie): 1 pole isauthenticated, 2 pakiet connect-ensure-login. 8 Wylogowanie się (opcjonalnie).

MEAN Stack - uwierzytelnienie 28/45 1. Instalacja pakietów Instalacja pakietów: npm install express-session --save npm install passport --save npm install passport-local --save // również mongoose, body-parser i inne jeśli potrzebne i ich wykorzystanie:... var session = require('express-session'); var passport = require('passport'); LocalStrategy = require('passport-local').strategy;...

MEAN Stack - uwierzytelnienie 29/45 2. Przygotowanie bazy danych Schemat bazy danych musi zawierać pola: username oraz password. Schemat musi dostarczać metodę do sprawdzenia poprawności hasła, np. validpassword(). mongoose.connect('mongodb://localhost/bazalog', function(err) { if(err) { console.log('błąd połączenia', err); } else { console.log('połączenie udane'); } }); var userschema = new mongoose.schema({ username: String, password: { type: String, default: "1234" }, first: String, last: String }); userschema.methods.validpassword = function (pass, callback) { return sha1(pass)==this.password; } var User = mongoose.model('user', userschema);

MEAN Stack - uwierzytelnienie 30/45 3. Wybór strategii Strategie wymagają weryfikującego wywołania zwrotnego (ang. verify callback). Funkcja wywołania zwrotnego ma znaleźć użytkownika z danymi podanymi do uwierzytelnienia. done() zwraca dane użytkownika do passport. 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); }); } ));

MEAN Stack - uwierzytelnienie 31/45 4. Ustawienie warstwy pośredniej Ustawienie sesji express musi być przed sesją passport. Inicjalizacja passport musi być po przygotowaniu konkretnej strategii. app.use(session({ resave: false, saveuninitialized: false, secret: 'tajny kod', cookie: { maxage: null } })); app.use(passport.initialize()); app.use(passport.session()); // sesja dla express'a, potrzebna // jeśli wykorzystujemy sesje // sesja dla passport, dodajemy TYLKO, // jeśli zdefiniowaliśmy serializację, // konieczna do trwałego zalogowania

MEAN Stack - uwierzytelnienie 32/45 5. Obsługa sesji (opcjonalnia ale zalecana) W typowej aplikacji dane uwierzytelniające są przesyłane tylko przy logowaniu. Po poprawnej autoryzacji utworzy się sesja z ID w ciasteczku przeglądarki. Każde kolejne żądanie nie będzie potrzebowało danych uwierzytelniających ale ciasteczka, które ma identyfikator sesji. passport dokona serializacji i deserializacji obiektu user (obiekt z mongodb) do i z sesji. passport.serializeuser(function(user, done) { // console.log(json.stringify(user)); // console.log(user.id); done(null, user.id); }); passport.deserializeuser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); });

MEAN Stack - uwierzytelnienie 33/45 5. Obsługa sesji (opcjonalnia ale zalecana) Tylko ID użytkownika jest użyte do serializacji do zapisu w sesji. Przy odbiorze żądań ID jest użyte do znalezienia użytkownika w bazie i odtworzeniu req.user. Serializację i deserializację dostarcza aplikacja, programista - duża elastyczność. passport.serializeuser(function(user, done) { done(null, user.id); }); passport.deserializeuser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); }); // {"username":"jb","_id":"571d56cb3bd41b73249ff3a0", "first":... } // req.session: // passport: { user: '5717ea4e909d743b23e58d2b' }

MEAN Stack - uwierzytelnienie 34/45 6. Uwierzytelnienie + login Bez wykorzystania sesji - (session: false) app.post('/logowanie', passport.authenticate('local', { session: false, successredirect: '/zalogowany', failureredirect: '/logowanie.html' }) ); Z wykorzystaniem sesji - (session: true), domyślnie Koniecznie trzeba zdefiniować serializację app.post('/logowanie', passport.authenticate('local', { successredirect: '/zalogowany', failureredirect: '/logowanie.html' }) );

MEAN Stack - uwierzytelnienie 35/45 6. Formularz logowania Formularz logowania: zawiera pola username oraz password adres /logowanie, metoda POST <form action="/logowanie" method="post"> <div> <label>login:</label> <input type="text" name="username"/> </div> <div> <label>hasło:</label> <input type="password" name="password"/> </div> <div> <input type="submit" value="zaloguj"/> </div> </form>

MEAN Stack - uwierzytelnienie 36/45 6. Ręczne logowanie, metoda login() Logowanie się w passport: passport udostępnia metodę login() działającą na obiekcie zapytania (req), metoda ma również alias: login(), metodę można użyć do ustanowienia sesji użytkownika. req.login(user, function(err) { if (err) { return next(err); } return res.redirect('/users/' + req.user.username); }); Po zakończeniu logowania user będzie przypisany do req.user. Warstwa pośrednia passport.authenticate() automatycznie wywołuje req.login(). Funkcja login() jest używana głównie w przypadku rejestracji użytkowników, których chcemy od razu zalogować.

MEAN Stack - uwierzytelnienie 37/45 7.1. Pole isauthenticated pakietu passport Korzystamy z nieudokumentowanego atrybutu, funkcji pakietu passport - isauthenticated. Brak uwierzytelnienia - przeniesienie na stronę /login. Użytkownik zalogowany, uwierzytelnienie poprawne - wyświetlenie danych sesji i informacji użytkownikowi. app.get('/authtest', function(req, res, next) { if (!req.isauthenticated!req.isauthenticated()) { return res.redirect('/login'); } else { console.log(req.session); res.send('### Użytkownik uwierzytelniony ###'); } });

MEAN Stack - uwierzytelnienie 38/45 7.2. Pakiet connect-ensure-login Korzystamy z metody ensureloggedin() pakietu connect-ensure-login. Brak uwierzytelnienia - przeniesienie na stronę /login. Użytkownik zalogowany, uwierzytelnienie poprawne - wyświetlenie danych sesji i informacji użytkownikowi. app.get('/authtest', require('connect-ensure-login').ensureloggedin('/login'), function(req, res){ console.log(req.session); res.send('### Użytkownik uwierzytelniony ###'); });

MEAN Stack - uwierzytelnienie 39/45 7.2. Pakiet connect-ensure-login Pakiet connect-ensure-login: wartswa pośrednia pozwalająca się upewnić, że użytkownik jest zalogowany, w przypadku żądania do zasobów bez uwierzytelnienia nastąpi przekierowanie na stronę logowania, adres URL żądania będzie zapisany w sesji; użytkownik będzie mógł być wygodnie przekierowany do strony, którą chciał otworzyć. app.get('/settings', ensureloggedin('/login'), function(req, res) { res.render('settings', { user: req.user }); }); Aplikacja ma stronę ustawień (settings) dostępną tylko dla zalogowanych. Niezalogowany użytkownik zostanie przekierowany na stronę /login. Adres orginalnego żądania (/settings) zostanie zapisany w req.session.returnto.

MEAN Stack - uwierzytelnienie 40/45 7.2. Pakiet connect-ensure-login Pakiet connect-ensure-login krok po kroku: app.get('/settings', ensureloggedin('/login'), function(req, res) { res.render('settings', { user: req.user }); }); 1 Żadanie adresu /settings Warstwa pośrednia ustawia session.returnto na /settings Warstwa pośrednia przekierowuje do /login 2 Przeglądarka użytkownika przechodzi do GET /login Aplikacja renderuje formularz logowania. 3 Użytkownik wpisuje dane i wysyła POST /login Aplikacja weryfikuje dane logowania. Passport odczytuje session.returnto i przekierowuje na /settings. 4 Przeglądarka użytkownika przekierowuje na GET /settings Po uwierzytelnieniu strona /settings wyświetla się w przeglądarce.

MEAN Stack - uwierzytelnienie 41/45 8.1. Wylogowanie się - metoda logout() Wylogowywanie się w passport: passport udostępnia metodę logout() działającą na obiekcie zapytania (req), metoda ma również alias: logout(), metodę można wywołać na dowolnej funkcji związanej z obsługą żądań, w której jest konieczność zakończenia sesji, wywołanie logout() usunie pole req.user i wyczyści sesję logowania (jeśli była). app.get('/logout', function(req, res){ req.logout(); res.redirect('/'); });

MEAN Stack - uwierzytelnienie 42/45 8.2. Pakiet express-passport-logout Pakiet express-passport-logout: warstwa pośrednia express, służy do wylogowania użytkownika z passport i przekierowania go do określonej lokalizacji wykonuje: req.logout() delete req.session przekierowuje na req.query.returnto jeśli adres istnieje, jeśli nie to zwraca res.send( bye ) module.exports = function() { return function (req, res) { var returnto = req.query.returnto; req.logout(); delete req.session; return redir(res, returnto); function redir(res, returnto) { if (returnto) { return res.redirect(returnto); } else { return res.send('bye'); } } }; };

MEAN Stack - uwierzytelnienie 43/45 8.2. Pakiet express-passport-logout Użycie express-passport-logout: var logout = require('express-passport-logout'); app.get('/logout', logout());

MEAN Stack - uwierzytelnienie 44/45 Tutoriale Dokumentacja passport - łatwa nie jest ale da się zrozumieć passport tutorial dla Express v4 - jest podział na moduły z pakietem passport-local-mongoose passport-local-express4 - działający przykład na github The Ins and Outs of Token Based Authentication - styczeń 2015. JSON Web Tokens - są też odniesienia do passport, kwiecień 2015. Restful API user authentication - tutorial z Web Tokens, listopad 2015.

MEAN Stack - uwierzytelnienie 45/45 Źródła https://pl.wikipedia.org/wiki/uwierzytelnianie https://pl.wikipedia.org/wiki/autoryzacja_(informatyka) https://pl.wikipedia.org/wiki/sesja_(informatyka) http://passportjs.org/ https://www.npmjs.com/package/passport-local https://devdactic.com/restful-api-user-authentication-1/ https://scotch.io/bar-talk/ the-ins-and-outs-of-token-based-authentication