MobileSecondHand – autentykacja po stronie serwera cz. 1.

Siemanko.

Dziś troszkę o tym jak rozwiązałem autentykację po stronie serwera (bo jest już zrobiona i działa). Post podzieliłem na dwie części coby mieć o czym pisać później bo ku mojemu zaskoczeniu (samym sobą? ;p) projekt idzie mi całkiem nieźle bo właśnie na chwilę przed rozpoczęciem pisania tego postu skończyłem klepać prototyp tworzenia nowego ogłoszenia po stronie telefonu, wysłania go na serwer, zapisania do bazy, i w końcu zwracania listy prawdziwnych ogłoszeń (bez hardcodu) oraz wyświetlenia jej w apce 🙂 Yeah!.  Są to oczywiście prototypy, które będę musiał przepisać porządnie, ale na razie skupiam się na funkcjonalnościach by dopieszczać je już działające.

Tyle słowem wstępu. Wracamy do tematu.

JWT Bearer Token

Projekt po stronie Asp.Net zakłada tylko WebApi do kumunikacji z aplikacją mobilną dlatego wiadomym dla mnie było, że autentykacja będzie realizowana przez token. Przyznam, że w mojej niedługiej karierze nie korzystałem jak dotąd z tokenów, dlatego właśnie postanowiłem to nadrobić. Zasadę działania autentykacji opartej na tokenie mniej więcej znałem z „telewizji”, ale nie wiedziałem od czego zacząć implementację, dlatego zacząłem typowo – google -> asp.net 5 token authentication -> enter -> trach, poszło. Przestudiowałem kilka artykułów, kilka stron i wybór padł na JWT Bearer Token. Dlaczego? Bo prosta implementcja, która sprowadziła się praktycznie do dopisania do dependencies w pliku project.json projektu startowego linijeczki:

„Microsoft.AspNet.Authentication.JwtBearer”: „1.0.0-rc1-final”

ctrl + s, bach, trach poszło, Jwt jest w projekcie. Następnie w klasie Startup projektu startowego odbywa się konfiguracja. W metodzie CofigureServices wpis:

aut1

Następnie w metodzie Configure:

aut2

Gdzie tokenAuthorizationOptions to obiekt konfiguracyjny z kluczem szyfrującym (RsaSecurityKey), który jest wczytywany z pliku i musi być zawsze ten sam dla aplikacji. Ja wstrzykuje sobie ten obiekt przez dependency injection.

Koniec konfiguracji. Teraz wystarczy opatrzeć metodę kontrolera lub cały kontroler atrybutem:

[Authorize(„Bearer”)]

i nie ma takiego wchodzenia na serwer bez tokenika! 😉 Uderzając z PostMan’a do aplikacji bez podania odpowiedniego nagłówka dostaniemy 401

aut3

jeśli uderzymy z nagłówkiem (o tworzeniu tokena w następnej części czyli w niedzielę):

Authorization: Bearer (token – ciąg znaków)

to jesteśmy wpuszczani do kontrolera.

Jwt Bearer middleware robi cała robotę. Z małym ale..

Bug w JWT Bearer midlleware w Asp.Net Core 1.0 rc1-final

Jeśli uderzamy bez tokena to spoko, jak było widać wcześniej dostajemy 401. Jeśli jednak uderzymy z nagłówkiem i token będzie błędny lub nieważny to dostaniemy 500!

aut5

aut4

Ogólnie to nie wiedziałem o co kaman bo przecież działało!

monkey

Po pewnym czasie dogoglowałem się do issue na githubie. A więc na szczęście to nie tylko u mnie 🙂 Można to obejść pisząc swoje middleware tuż przed JWTmiddleware na pipeline, które łapie w try catch następne wywołanie. W catchu złapie się ten wyjątek i po sprawdzeniu czy wyjątek jest tym, który nas interesuje, możemy zwrócić 401 (na screenie jeszcze nie dopisałem rozróżniania jaki to wyjątek dlatego jest samo Exception, a powinny być te związane z walidacją tokena):

aut6

Podsumowanie części 1

Poza tym bugiem to wydaje się być wszystko ok. Najważniejsze, że problem został rozwiązany, a o to przecież chodzi w naszym fachu 😉 Gdyby to miała być biznesowa aplikacja to na pewno bym nie skorzystał z JWT z bugiem, ale skoro to ma być apka, która zapewne nie zawita nigdy na google play (no chyba, że dla jaj) to co tu się szczypać!;)

W niedzielę część 2.

Pjona!

 

Reklamy

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Wyloguj / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Wyloguj / Zmień )

Connecting to %s