MEAN Stack - JSON Web Token

Podobne dokumenty
MEAN Stack - JSON Web Token

Dokumentacja techniczna API systemu SimPay.pl

API transakcyjne BitMarket.pl

Gatesms.eu Mobilne Rozwiązania dla biznesu

SSL (Secure Socket Layer)

Automater.pl zdalne tworzenie i zarządzanie transakcjami dokumentacja API wersja 0.1

Bezpieczeństwo aplikacji typu software token. Mariusz Burdach, Prevenity. Agenda

Kurs rozszerzony języka Python

Dokumentacja REST API v 3.0

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

Dokumentacja REST API v 3.0. Kraków, 7 marca FreshMail, ul. Fabryczna 20a, Kraków tel , freshmail.

Specyfikacja techniczna. mprofi Interfejs API

MEAN Stack - uwierzytelnienie

MEAN Stack - uwierzytelnienie

Specyfikacja interfejsów usług Jednolitego Pliku Kontrolnego

PHP: bloki kodu, tablice, obiekty i formularze

Internetowe bazy danych

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

ZABEZPIECZENIE KOMUNIKACJI Z SYSTEMEM E-PŁATNOŚCI

INTERNET - Wrocław Usługi bezpieczeństwa w rozproszonych strukturach obliczeniowych typu grid

DOKUMENTACJA TECHNICZNA SMS API MT

Specyfikacja API 1.0. Specyfikacja kontroli Konta systemu CashBill z wykorzystaniem API opartego na REST

Systemy pojedynczego logowania (Single Sign-On)

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

Programowanie Komponentowe WebAPI

Dokumentacja smsapi wersja 1.4

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

Java wybrane technologie

SMS Kod Automatyczny

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

Spis treści 1. Założenia ogólne 2. Wymagania 3. Typy SMSów 4. Statusy SMSów 5. Wysyłanie SMSów - Web API 6. Wysyłanie SMSów - 7.

Protokół IPsec. Patryk Czarnik

Java Code Signing UŜycie certyfikatów niekwalifikowanych do podpisywania kodu w technologii Java. wersja 1.2 UNIZETO TECHNOLOGIES SA

Sieci komputerowe i bazy danych

Języki programowania wysokiego poziomu. PHP cz.4. Bazy danych

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

Aplikacje www laboratorium

Co to jest NODE.JS? Nowoczesne środowisko programistyczne

Marcin Szeliga Sieć

Wprowadzenie. 1. Terminal WebRTC. LABORATORIUM 5: WebRTC komunikacja między terminalami.

Ewolucja projektowania aplikacji w PHP na bazie frameworka Symfony 2

Dokumentacja Techniczna. Dokumentacja techniczna usługi płatności mobilnych

Baza danych do przechowywania użytkowników

Java Enterprise Edition spotkanie nr 1 (c.d.) JavaMail

Wykład 4 Bezpieczeństwo przesyłu informacji; Szyfrowanie

Dokumentacja REST API v 3.0

Exchange 2007 Konfiguracja protokołu SSL/TLS w serwerze pocztowym Exchange 2007 wersja 1.1 UNIZETO TECHNOLOGIES S.A.

Specyfikacja instalacji usługi SMS Premium w Przelewy24.pl

DOKUMENTACJA INTERFEJSU API - HTTPS

Wykład 4. komputerowych Protokoły SSL i TLS główne slajdy. 26 października Igor T. Podolak Instytut Informatyki Uniwersytet Jagielloński

1 Wprowadzenie do J2EE

Funkcje dodatkowe. Wersja 1.2.1

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

Przesyłania danych przez protokół TCP/IP

Podręcznik Integracji

System DiLO. Opis interfejsu dostępowego v. 2.0

PGP - Pretty Good Privacy. Użycie certyfikatów niekwalifikowanych w programie PGP

Dokumentacja Techniczna 1.2. Webtoken MT. Uruchomienie subskrybcji MT poprzez serwis WWW

Bezpieczne protokoły Materiały pomocnicze do wykładu

Ogólnopolskie Repozytorium Prac Dyplomowych

WebNotarius. Specyfikacja techniczna komunikacji z usługą WebNotarius. wersja 1.1

On-Board Unit (OBU) Rejestracja. Spis treści Logowanie... 1

Biblioteka NaCl. Instytut Telekomunikacji Wydział Elektroniki i Technik Informacyjnych Politechnika Warszawska

REFERAT PRACY DYPLOMOWEJ

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Aktualizacja SMSFall v Data publikacji:

Paweł Rajba,

Komunikator internetowy w C#

Architektura bezpiecznych aplikacji internetowych na platformie Java Enterprise Edition. Jakub Grabowski Warszawa,

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

I. Uruchomić setup i postępować według instrukcji

Implementacja mechanizmu SkyCashClick Wersja 0.1

Funkcje dodatkowe. Wersja 1.2.1

Dokumentacja 2SMS

Krótka instrukcja instalacji

Protokół DHCP. DHCP Dynamic Host Configuration Protocol

Bramka płatnicza. Dokumentacja techniczna. wersja 1.0

Java wybrane technologie

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

ZiMSK. Konsola, TELNET, SSH 1

4. Podstawowa konfiguracja

Exchange Konfiguracja protokołu SSL/TLS w serwerze pocztowym Exchange wersja 1.0 UNIZETO TECHNOLOGIES S.A.

(Pluggable Authentication Modules). Wyjaśnienie technologii.

Wykład 3 Inżynieria oprogramowania. Przykład 1 Bezpieczeństwo(2) wg The Java EE 5 Tutorial Autor: Zofia Kruczkiewicz

Spis treści INTERFEJS (WEBSERVICES) - DOKUMENTACJA TECHNICZNA 1

76.Struktura oprogramowania rozproszonego.

Rejestracja w serwisie GTC Siemens Instrukcja instalacji NX dla studentów i pracowników Politechniki Lubelskiej

Budowa wiadomości SMTP. autorzy: Aleksandra Wichert Marcin Żurowski

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

Wykład 3 Bezpieczeństwo przesyłu informacji; Szyfrowanie

Serwer SSH. Wprowadzenie do serwera SSH Instalacja i konfiguracja Zarządzanie kluczami

ZADANIE.07. Procesy Bezpieczeństwa Sieciowego v.2011alfa ZADANIE.07. VPN RA Virtual Private Network Remote Access (Router) - 1 -

Obiektowy PHP. Czym jest obiekt? Definicja klasy. Składowe klasy pola i metody

Sesje i logowanie. 1. Wprowadzenie

Dokumentacja SMS przez FTP

Sprawozdanie nr 4. Ewa Wojtanowska

Baza numerów Wersja 1.1

Transkrypt:

EAN Stack - JSON Web Token 1/37 MEAN Stack - JSON Web Token Tworzenie serwisów Web 2.0 dr inż. Robert Perliński rperlinski@icis.pcz.pl Politechnika Częstochowska Instytut Informatyki Teoretycznej i Stosowanej 22 marca 2017

MEAN Stack - JSON Web Token 2/37 Plan prezentacji 1 JSON Web Token Budowa i działanie JWT JWT Header JWT Payload JWT Signature Jak JWT chroni dane? JWT w Node.js i Express.js Pakiet jwt-async Pakiet express-jwt 2 Źródła

MEAN Stack - JSON Web Token 3/37 https://jwt.io/ JSON Web Token to otwarty, przemysłowy standard RFC 7519, który definiuje zwięzyły i samowystarczalny sposób na bezpiecznie przekazanie informacji pomiędzy dwiema stronami w formie obiektu JSON. Taka przekazana informacja może być zweryfikowana ponieważ jest cyfrowo podpisana. JWT może być podpisany używając tajnego klucza (algorytm HMAC) albo przy pomocy pray kluczy publiczny/prywatny używając algorytmu RSA. jwt.io pozwala na dekodowanie, weryfikację i generowanie JWT.

MEAN Stack - JSON Web Token 4/37 Cechy JWT Mały rozmiar - pozwala na przesyłanie tokentów: w adresie URL, jako parametry metody POST, w nagłówku protokołu HTTP. Samodzielny - JWT zawiera wszystkie potrzebne do weryfikacji informacje, nie ma potrzeby dodatkowego łączenia się np. z bazą danych. Kiedy warto używać? Uwierzytelnienie - najczęstszy scenariusz dla JWT. Jedno zalogowanie się wystarczy do uzyskania JWT i wielokrotnego dostępu do danych przy użyciu tokenu. Można łatwo używać nawet dla wielu domen. Wymiana informacji - dobrze nadaje się w wymianie informacji między stronami, może być podpisany z użyciem pary kluczy publiczny/prywatny. Mamy pewność nadawcy. Mamy też pewność, że odebrane dane (nagłówek i ładunek) są nienaruszone.

EAN Stack - JSON Web Token 5/37 JSON Web Token JSON Web Token to obiekt JSON zdefiniowany według standardu RFC 7519, który pozwala w bezpieczny sposób na reprezentację zbioru informacji między dwiema stronami. Token składa sie z nagłówka (header), zawartości (payload) i podpisu (signature). Najproście mówiąc JWT to zbiór znaków w następującym formacie: header.payload.signature Zbiór znaków w cudzysłowiu to poprawny obiekt JSON. Przykład gotowego tokena: eyj0exaioijkv1qilcjhbgcioijiuzi1nij9. eyjlehaioiixndg5njazndqwiiwibmftzsi6ikphbwvziejvbmqilcjhzg1pbii6dhj1 ZSwidXNlcklkIjoiYjA4Zjg2YWYtMzVkYS00OGYyLThmYWItY2VmMzkwNDY2MGJkIn0. koe-_iigdbobzsyfziqb45vavbik6atzpklubhxjpqw

EAN Stack - JSON Web Token 6/37 Kodowanie base 64 Base 64: Jedno z grupy kodowań danych binarnych na format tekstowy. Dane binarne są reprezentowane za pomocą kodu ASCII. Dane poszczególnych bajtów (8 bitów) są zastępowane systemem o podstawie 64 (zamiast 256). Każdy znak w Base 64 odpowiada 6 bitom reprezentacji binarnej. Znaki w Base 64 to: A-Z, a-z, 0-9, +, /, = (pad, znak dopełnienia). Znaki +, / zastępowane czasem w adresach URL -, Przykład: var JWT = require('jwt-async');... console.log( JWT.base64urlEncode('Man is like a...') ); TWFuIGlzIGxpa2UgYSAuLi4 Trzy litery Man odpowiadają zapisowi TWFu

JSON Web Token na jwt.io MEAN Stack - JSON Web Token 7/37

MEAN Stack - JSON Web Token 8/37 Zalety JWT Zalety JWT w porównaniu do SWT (Simple Web Token) i SAML (Security Assertion Markup Language Tokens): mniejsze niż SAML - JSON jest bardziej zwięzły niż XML, lepiej nadaje się w środowisku HTML i dla protokołu HTTP, parsery JSONa są dostępne w większości języków programowania, bezpośrednio mapują się na obiekty, łatwiej niż z językiem XML, JWT jest używany na skalę internetową, bardzo łatwo używać JWT po stronie klienta na wielu platformach, szczególnie urządzeń przenośnych.

Dostępność JWT w różnych językach programowania Biblioteki do pospisywania i weryfikacji JWT dostępne w wielu językach programowania:.net (System.IdentityModel.Tokens.Jwt, jose-jwt, jose-rt), Python (pyjwt, python-jose, jwcrypto), Node.js (jsonwebtoken), Java (com.auth0 / java-jwt / 3.0.1, org.bitbucket.b c / jose4j / 0.5.0,...) JavaScript (jsrsasign), Perl (Crypt::JWT), Ruby (jwt, json-jwt, json web token), Go (github.com/dgrijalva/jwt-go, github.com/dvsekhvalnov/jose2go,...), Haskel (jwt, jose) D (jwtd), Clojure (funcool/buddy 0.6.0 ), Objective-C (pod JWT ), C (ppa:ben-collins/libjwt), PHP (firebase/php-jwt, namshi/jose, lcobucci/jwt,...).... MEAN Stack - JSON Web Token 9/37

Wykorzystanie JWT MEAN Stack - JSON Web Token 10/37

MEAN Stack - JSON Web Token 11/37 JSON Web Token Działanie JWT, trzy podmioty: użytkownik, serwer aplikacji, serwer uwierzytelniający. Serwer uwierzytelniający udostępnia JWT użytkownikowi. Używając JWT użytkownik może bezpiecznie komunikować się z serwerem aplikacyjnym. Krok po kroku: 1 Użytkownik loguje się do serwera uwierzytelniającego (login i hasło, Google login, Facebook login,...). 2 Serwer uwierzytelniający tworzy dla użytkownika JWT i przesyła mu go. 3 Użytkownik wysyłając żądania aplikacji przesyła razem z nimi uzyskany token. 4 Serwer aplikacyjny weryfikuje czy dany token jest utworzony przez odpowieni serwer uwierzytelniający. Pozwoli to na zweryfikowanie, czy dany użytkownik jest uwierzytelniony. 5 Serwer aplikacji odpowiada na żądanie przekazując dopowiednie dane.

MEAN Stack - JSON Web Token 12/37 Wykorzystanie JWT Otrzymany od serwera token użytkownik zapsuje lokalnie, zwykle w local storage, ale mogą być też ciasteczka. Jest to inne podejście niż tworzenie sesji na serwerze i zwracanie ciasteczka. Kiedy chcemy mieć dostęp do określonych zasobów używamy JWT odpowiedniego agenta, zwykle jest to nagłówek Header ze schematem Bearer (ang. na okaziciela): Authorization: Bearer <token> Mechanizm tego uwierzytelnienia jest bezstanowy (serwerz nie przechowuje w pamięci żadnych informacji o użytkowniku). JWT jest samowystarczalny, nie ma potrzeby pobierać żadnych dodatkowych danych, np. z bazy.

Wykorzystanie JWT MEAN Stack - JSON Web Token 13/37

MEAN Stack - JSON Web Token 14/37 Nagłówek JSON Web Token { } Nagłówek JWT zawiera informacje określające jak wygenerować podpis. Nagłówek jest obiektem JSON o następującym formacie: "typ": "JWT", "alg": "HS256" "typ" informuje, że jest to obiekt JWT, "alg" określa jakiego algorytmu użyjemy do wygenerowania podpisu.tutaj jest to algorytm HMAC-SHA256.

MEAN Stack - JSON Web Token 15/37 Algorytmy określone przez standard RFC 7518 JWS (JSON Web Signature) używa allgorytmów do podpisania nagłówka i ładunku. Standard RFC 7518 określa następujące algorytmy: Wartość parametru "alg" Podpis cyfrowy albo algorytm MAC wymagania implementacji HS256 HMAC z użyciem SHA-256 wymagany HS384 HMAC z użyciem SHA-384 opcjonalny HS512 HMAC z użyciem SHA-512 opcjonalny RS256 RSASSA-PKCS1-v1_5 z użyciem SHA-256 zalecany RS384 RSASSA-PKCS1-v1_5 z użyciem SHA-384 opcjonalny RS512 RSASSA-PKCS1-v1_5 z użyciem SHA-512 opcjonalny ES256 ECDSA z użyciem P-256 i SHA-256 zalecany ES384 ECDSA z użyciem P-384 i SHA-384 opcjonalny ES512 ECDSA z użyciem P-521 i SHA-512 opcjonalny PS256 RSASSA-PSS z użyciem SHA-256 i MGF1 z SHA-256 opcjonalny PS384 RSASSA-PSS z użyciem SHA-384 i MGF1 z SHA-384 opcjonalny PS512 RSASSA-PSS z użyciem SHA-512 i MGF1 z SHA-512 opcjonalny none Bez podpisu cyfrowego czy wykonywania alg. MAC opcjonalny

MEAN Stack - JSON Web Token 16/37 Ładunek JSON Web Token Ładunek (ang. payload) JWT: Przechowuje dane zawarte w tokenie. Są to z ang. tzw. "claims" of JWT. To są informacje, które chcemy przesłać oraz inne informacje o tokenie. Stwierdzenia (claims) mogą być: zarezerwowane, publiczne i prywatne.

MEAN Stack - JSON Web Token 17/37 Rodzaje stwierdzeń (claims) w JWT I Zarezerwowane, nie są obowiązkowe ale część z nich (albo wszystkie) może okazać się przydatna. Mogą służyć za bazę dobrej, funkcjonalnej zawartości tokenu konkretnego serwisu. iss: (ang. issuer), wystawca tokenu, np. myapp.io, sub: (ang. subject), podmiot tokenu (unikalna nazwa w serwisie (lokalnie) albo w całej sieci (globalnie)), aud: (ang. audience), odbiorcy tokenu, grupa osób (unikalne nazwy w tablicy), exp: (ang. expiration time), określa czas utraty ważności przez token w formacie NumericDate, często używane, musi być większa niż bieżąca data/czas, nbf: (ang. not before), określa kiedy token nie będzie jeszcze ważny, iat: (ang. issued at), określa kiedy wydano token, pozwala na określenie jego wieku, jti: (ang. JWT ID), unikalny identyfikator dla tokenu, zapobiega powtórzeniu się tokenu, wydawca tokenu musi zapewnić tutaj dane bez możliwości wystąpienia kolizji, niepowtarzające się.

MEAN Stack - JSON Web Token 18/37 Rodzaje stwierdzeń (claims) w JWT II Przykład: { } Publiczne - nazwy dowolnie określane przez użytkowników JWT ale... żeby zapobiec kolizjom powinny być specjalnym rejestrze IANA "JSON Web Token Claims" albo powinny być nazwami publicznymi. Prywatne - producent/wydający i uzytkownik JWT mogą zgodzić się na używanie własnych nazw, prywatnych, które nie są zarezerwowane ani publiczne. Mogą one powodować kolizje i należy używać ich ostrożnie. "iss": "scotch.io", "exp": 1489603440, "name": "James Bond", "admin": true, "userid": "b08f86af-35da-48f2-8fab-cef3904660bd"

MEAN Stack - JSON Web Token 19/37 Publiczne rodzaje stwierdzeń (claims) w JWT I nazwa opis iss Issuer sub Subject aud Audience exp Expiration Time nbf Not Before iat Issued At jti JWT ID name Full name given name Given name(s) or first name(s) family name Surname(s) or last name(s) middle name Middle name(s) nickname Casual name preferred username Shorthand name by which the End-User wishes to be referred to profile Profile page URL picture Profile picture URL website Web page or blog URL email Preferred e-mail address email verified True if the e-mail address has been verified; otherwise false gender Gender birthdate Birthday zoneinfo Time zone locale Locale......

MEAN Stack - JSON Web Token 20/37 Publiczne rodzaje stwierdzeń (claims) w JWT II nazwa opis..... phone number Preferred telephone number phone number verified True if the phone number has been verified; otherwise false address Preferred postal address updated at Time the information was last updated azp Authorized party - the party to which the ID Token was issued nonce Value used to associate a Client session with an ID Token auth time Time when the authentication occurred at hash Access Token hash value c hash Code hash value acr Authentication Context Class Reference amr Authentication Methods References sub jwk Public key used to check the signature of an ID Token cnf Confirmation sip from tag SIP From tag header field parameter value sip date SIP Date header field value sip callid SIP Call-Id header field value sip cseq num SIP CSeq numeric header field parameter value sip via branch SIP Via branch header field parameter value

MEAN Stack - JSON Web Token 21/37 Podpis Podpis generowany jest nestępująco: sign = HMACSHA256( base64urlencode(header) + "." + secret) base64urlencode(payload), Łączymy nagłówek i ładunek JWT zakodowane w Base 64 i połączone. i razem z sekretnym kluczem (secret) liczona jest funkcja skrótu algorytmem określonym w nagłówku (HS256). Przykład wygenerowanego podpisu: koe-_iigdbobzsyfziqb45vavbik6atzpklubhxjpqw Cały token: eyj0exaioijkv1qilcjhbgcioijiuzi1nij9. eyjlehaioiixndg5njazndqwiiwibmftzsi6ikphbwvziejvbmqilcjhzg1pbii6dhj1 ZSwidXNlcklkIjoiYjA4Zjg2YWYtMzVkYS00OGYyLThmYWItY2VmMzkwNDY2MGJkIn0. koe-_iigdbobzsyfziqb45vavbik6atzpklubhxjpqw

MEAN Stack - JSON Web Token 22/37 Jak JWT chroni dane? Celem JWT nie jest ukrycie naszych danych w jakikolwiek sposób. Celem JWT jest uzyskanie pewności, że przesłane dane zostały utworzone przez wiarygodne źródło. Dane zawarte w JWT zostały zapisane w Base 64 i podpisane ale nie zaszyfrowane. Zapisanie danych w Base 64 ma na celu zmianę struktury danych. Podpisanie danych pozwala aplikacji odbiorającej token zweryfikować poprawność tych danych. Zapisanie danych w Base 64 i podpisanie ich nie ukrywa danych. Głównym celem JWT jest zapobieganie nieuprwnionemu dostępowi.

MEAN Stack - JSON Web Token 23/37 Weryfikowanie tokenu Dwa podmioty znają sekretny klucz wykorzystywany przy generowaniu JWT: serwer uwierzytelniający i serwer aplikacyjny. Serwer aplikacyjny uzykuje sekretny klucz od serwera uwierzytelniającego kiedy ten ustawia swój proces uwierzytelnienia. Znając tajny klucz, aplikacja może wygenerować podpis dla przesłanego ładunku JWT i porównać go z jego podpisem. Jeśli porównanie okaże się prawidłowe oznacza, że użytkownik jest uwierzytelniony, można mu odesłać dane. W przeciwnym przypadku może być to jakaś próba ataku na dane dostępne w aplikacji.

MEAN Stack - JSON Web Token 24/37 Używanie JWT w Express W repozytoriach npm mamy dużo pakietów związanych z JWT. Ważniejsze pakiety: express-jwt - chyba podstawowy pakiet do JWT w Express, napisany przez Auth0, jsonwebtoken - oficjalny pakiet dostawców JWT czyli Auth0, jwt-async - spore możliwości, działa też asynchronicznie, pozwala również na kododwanie/dekodowanie Base 64, jwt-simple - minimalna funkcjonalność wystarczająca do obsługi JWT, wiele, wiele innych...

EAN Stack - JSON Web Token 25/37 Tworzenie JWT w jwt-async app.js Tworzmy szkielet aplikacji: express -v pug myjwt Instalujemy wszystko: npm install Instalujemy pakiet jwt-async: npm install --save jwt-async Tworzmymy sobie dodatkowe trasy do testowania JWT: var jwt = require('./routes/jwt');... app.use('/jwt', jwt); jwt.js W module routes/jwt.js dołączamy bibliotekę: var JWT = require( jwt-async ); Używamy biblioteki, np. do uzyskania listy dostępnych algorytmów: router.get('/algorithms', function(req, res, next) { console.log( JWT.getSupportedAlgorithms() ); res.send('lista algorytmów w konsoli'); });

EAN Stack - JSON Web Token 26/37 Lista algorytmów do tworzenia JWT w jwt-async Lista algorytmów: { NONE: 'No digital signature or MAC performed', HS256: 'HMAC using SHA-256', HS384: 'HMAC using SHA-384', HS512: 'HMAC using SHA-512', RS256: 'RSASSA-PKCS-v1_5 using SHA-256', RS384: 'RSASSA-PKCS-v1_5 using SHA-384', RS512: 'RSASSA-PKCS-v1_5 using SHA-512', ES256: 'ECDSA using P-256 and SHA-256', ES384: 'ECDSA using P-384 and SHA-384', ES512: 'ECDSA using P-521 and SHA-512' }

EAN Stack - JSON Web Token 27/37 Kodowanie do Base w jwt-async Zawartość nagłówka i ładunku i kodowanie do Base 64: router.get('/header-payload', function(req, res, next) { var header = '{"typ":"jwt","alg":"hs256"}'; var payload = '{"exp":"1489603440","name":"james Bond","admin":true,\ "userid": "b08f86af-35da-48f2-8fab-cef3904660bd"}'; console.log( JWT.base64urlEncode(header) ); console.log( JWT.base64urlEncode(payload) ); res.send('zakodowany nagłówek i ładunek w konsoli'); }); Uzyskana zawartość nagłówka i ładunku w Base 64: eyj0exaioijkv1qilcjhbgcioijiuzi1nij9 eyjlehaioiixndg5njazndqwiiwibmftzsi6ikphbwvziejvbmqilcjhzg1pbii6dhj1 ZSwidXNlcklkIjogImIwOGY4NmFmLTM1ZGEtNDhmMi04ZmFiLWNlZjM5MDQ2NjBiZCJ9

MEAN Stack - JSON Web Token 28/37 Generowanie podpisu w jwt-async Podpisanie ładunku i uzyskanie tokenu: router.get('/generate-jwt', function(req, res, next) { var header = '{"typ":"jwt","alg":"hs256"}'; var payload2 = {"exp":"1489603440","name":"james Bond","admin":true, "userid": "b08f86af-35da-48f2-8fab-cef3904660bd"}; var jwt = new JWT(); // tworzymy instancję jwt, domyślnie jest algorytm HS256 jwt.setsecret('secret'); // ustawiamy sekret jwt.sign(payload2, function (err, data) { // podpisujemy JWT if (err) console.log(err); console.log(data); }); res.send('cały token wyświetlony w konsoli'); }); Cały token z podziałem na nagłówek, ładunek i podpis: eyj0exaioijkv1qilcjhbgcioijiuzi1nij9. eyjlehaioiixndg5njazndqwiiwibmftzsi6ikphbwvziejvbmqilcjhzg1pbii6dhj1 ZSwidXNlcklkIjoiYjA4Zjg2YWYtMzVkYS00OGYyLThmYWItY2VmMzkwNDY2MGJkIn0. koe-_iigdbobzsyfziqb45vavbik6atzpklubhxjpqw

MEAN Stack - JSON Web Token 29/37 Pozytywne weryfikowanie podpisu w jwt-async Kod od weryfikowania tokenu: router.get('/verify-jwt', function(req, res, next) { var token= 'eyj0exaioijkv1qilcjhbgcioijiuzi1nij9.\ eyjlehaioiixndg5njazndqwiiwibmftzsi6ikphbwvziejvbmqilcjhzg1pbii6dhj1\ ZSwidXNlcklkIjoiYjA4Zjg2YWYtMzVkYS00OGYyLThmYWItY2VmMzkwNDY2MGJkIn0.\ koe-_iigdbobzsyfziqb45vavbik6atzpklubhxjpqw'; var jwt = new JWT(); // tworzymy instancję jwt, domyślnie jest algorytm HS256 jwt.setsecret('secret'); // ustawiamy sekret jwt.verify(token, function (err, data) { // weryfikujemy JWT if (err) console.log(err); console.log(data); // zdekodowany i zweryfikowany JWT w konsoli }); res.send('zweryfikowany token wyświetlony w konsoli'); }); Cały token z podziałem na nagłówek, ładunek i podpis: { header: { typ: 'JWT', alg: 'HS256' }, claims: { exp: '1489603440', name: 'James Bond', admin: true, userid: 'b08f86af-35da-48f2-8fab-cef3904660bd' } }

MEAN Stack - JSON Web Token 30/37 Weryfikowanie podpisu z błędem w jwt-async Kod od weryfikowania tokenu: router.get('/verify-jwt-error', function(req, res, next) { var token= 'eyj0exaioijkv1qilcjhbgcioijiuzi1nij9.\ eyjlehaioiixndg5njazndqwiiwibmftzsi6ikphbwvziejvbmqilcjhzg1pbii6dhj2\ ZSwidXNlcklkIjoiYjA4Zjg2YWYtMzVkYS00OGYyLThmYWItY2VmMzkwNDY2MGJkIn0.\ koe-_iigdbobzsyfziqb45vavbik6atzpklubhxjpqw'; var jwt = new JWT(); // tworzymy instancję jwt, domyślnie jest algorytm HS256 jwt.setsecret('secret'); // ustawiamy sekret jwt.verify(token, function (err, data) { // weryfikujemy JWT if (err) console.log(err); console.log(data); // zdekodowany i zweryfikowany JWT w konsoli }); res.send('zweryfikowany token wyświetlony w konsoli'); }); Cały token z podziałem na nagłówek, ładunek i podpis: { [JWTValidationError: JWT is unparsable] name: 'JWTValidationError', message: 'JWT is unparsable' } undefined

EAN Stack - JSON Web Token 31/37 Pakiet express-jwt I Instalujemy dwa pakiety: express-jwt: npm install --save express-jwt jsonwebtoken: npm install --save jsonwebtoken Dołączamy je do projektu: var expressjwt = require('express-jwt'); var jsonwebtoken = require('jsonwebtoken'); Dodajemy do projetku JWT jako warstwę pośrednią, która będzie sprawdzać czy dostęp do adresu URL jest uwierzytelniany tokenem. Podajemy od razu adresy URL nie wymagające tokenu. app.use(expressjwt({ secret: "secret" }). unless({ path: ['/login', '/getstudents', '/loggers'] }))

EAN Stack - JSON Web Token 32/37 Pakiet express-jwt II Obsługa adresu /login, który, w przypadku poprawnych danych, zwraca JWT użytkownikowi app.post('/login', function(req,res){ if(!req.body.username){ res.status(400).send('potrzeba nazwy użytkownika'); return; } if(!req.body.password){ res.status(400).send('potrzeba jeszcze hasła'); return; } Loggers.findOne({username: req.body.username}, function(err, logger){ if(logger.password==req.body.password) { var token = jsonwebtoken.sign({ username: req.body.username }, 'secret'); res.status(200).json(token); } else { res.status(401).send('błędne hasło'); } }); });

Pakiet express-jwt III MEAN Stack - JSON Web Token 33/37

Pakiet express-jwt IV MEAN Stack - JSON Web Token 34/37

Pakiet express-jwt V MEAN Stack - JSON Web Token 35/37

Pakiet express-jwt VI MEAN Stack - JSON Web Token 36/37

MEAN Stack - JSON Web Token 37/37 Źródła https://jwt.io/ https://en.wikipedia.org/wiki/base64 https://medium.com/vandium-software/ 5-easy-steps-to-understanding-json-web-tokens-jwt-1164c0adfcec https://scotch.io/tutorials/the-anatomy-of-a-json-web-token https://www.iana.org/assignments/jwt/jwt.xhtml https://scotch.io/bar-talk/ the-ins-and-outs-of-token-based-authentication https: //feedersec.github.io/jwt/2016/10/15/mac-algorithm-key-for-jwt.html