Chciałbym poprosić Was o poradę odnośnie architektury, którą chcę zastosować w mojej aplikacji.
Główne elementy
- Aplikacja webowa (MVC) ASP.NET
- Klient na Androida
- później być może inni klienci (iOS, WP)
Wszystko zbudowane w oparciu o Web serwis wykonany Web API (2), który będzie udostępniał pełną funkcjonalność aplikacji web i klientom mobilnym:
- zakładanie kont
- logowanie
- przeglądanie, dodawanie danych przez zalogowanych użytkowników
Powiedzmy, że po zalogowaniu usera wygeneruje i zwrócę klientowi jakiś identyfikator sesji/token.
Web API powinno otrzymywać ten token każdorazowo kiedy wykonywana jest jakaś akcja kontrolera.
Strona internetowa może sobie trzymać ten token w sesji.
Android może sobie trzymać token nawet w jakiejś zmiennej.
Chyba muszę ten token przekazywać w do API w dodatkowym headerze HTTP?
Bo przecież w aplikacji Androidowej nie będę miał ciasteczek?
Z androida chyba nie będzie problemu.
A jak załączać ten header np. w requestach AJAX ze strony?
Gdzie wtedy trzymać ten klucz po stronie przeglądarki skoro ajax musi go znać żeby odpytać web api?
Jak to sensownie rozwiązać?
I kolejne pytanie:
Jak rozwiązuje się kwestie ładowania danych np. do tabelki na stronie?
Powiedzmy przy pierwszym wejściu na podstronę z listą warzyw chciałbym żeby serwer zwrócił stronę z już uzupełnioną tabelką.
Tutaj musiałbym np. w kontrolerze z kodu C# odwołać się do Web API, pobrać warzywa i wrzucić do widoku.
Potem jeśli sama tabelka ma być odświeżana ajaxem co 30 sekund to znowu muszę to pobierać ajaxem?
Wtedy w dwóch miejscach musiałbym pobierać dane:
w kontrolerze w C# aby zwrócić wypełniony widok przy pierwszym wejsciu na strone, a potem dodatkowo to samo robić jeszcze ajaxem w JS przy odświeżaniu.
Coś mi tu nie gra. Jak to się robi? :) Jakie jest sensowne rozwiązanie?
Technicznie rzecz biorąc wysyłanie tokena w ciasteczku i headerze to to samo. Content ciasteczek jest wysyłany w specjalnym headerze http://en.wikipedia.org/wiki/HTTP_cookie
@krukers: wejdź sobie na codeshool i znajdź darmowy video interaktywny turorial do angular.js... 2 godziny i zajebiście ogarniesz SPA... sprawdź, to może się przekonasz :)
Chciałbym poprosić Was o poradę odnośnie architektury, którą chcę zastosować w mojej aplikacji.
Główne elementy
- Aplikacja webowa (MVC) ASP.NET
- Klient na Androida
- później być może inni klienci (iOS, WP)
Wszystko zbudowane w oparciu o Web serwis wykonany Web API (2), który będzie udostępniał pełną funkcjonalność aplikacji web i klientom mobilnym:
- zakładanie kont
- logowanie
- przeglądanie, dodawanie danych przez zalogowanych użytkowników
Powiedzmy, że po zalogowaniu usera wygeneruje i zwrócę klientowi jakiś identyfikator sesji/token.
Web API powinno otrzymywać ten token każdorazowo kiedy wykonywana jest jakaś akcja kontrolera.
Strona internetowa może sobie trzymać ten token w sesji.
Android może sobie trzymać token nawet w jakiejś zmiennej.
Chyba muszę ten token przekazywać w do API w dodatkowym headerze HTTP?
Bo przecież w aplikacji Androidowej nie będę miał ciasteczek?
Z androida chyba nie będzie problemu.
A jak załączać ten header np. w requestach AJAX ze strony?
Gdzie wtedy trzymać ten klucz po stronie przeglądarki skoro ajax musi go znać żeby odpytać web api?
Jak to sensownie rozwiązać?
I kolejne pytanie:
Jak rozwiązuje się kwestie ładowania danych np. do tabelki na stronie?
Powiedzmy przy pierwszym wejściu na podstronę z listą warzyw chciałbym żeby serwer zwrócił stronę z już uzupełnioną tabelką.
Tutaj musiałbym np. w kontrolerze z kodu C# odwołać się do Web API, pobrać warzywa i wrzucić do widoku.
Potem jeśli sama tabelka ma być odświeżana ajaxem co 30 sekund to znowu muszę to pobierać ajaxem?
Wtedy w dwóch miejscach musiałbym pobierać dane:
w kontrolerze w C# aby zwrócić wypełniony widok przy pierwszym wejsciu na strone, a potem dodatkowo to samo robić jeszcze ajaxem w JS przy odświeżaniu.
Coś mi tu nie gra. Jak to się robi? :) Jakie jest sensowne rozwiązanie?
Bo przecież w aplikacji Androidowej nie będę miał ciasteczek?
W takim wypadku musi być https bo ktoś przechwyci token.
Zależy jaki ma być poziom bezpieczeństwa.
@krukers: Jako parametr webserwisu.
przekazywałbym jeszcze token związany z aplikacją.
aplikacja i serwer powinny mieć swoje klucze, którymi będą podpisywały komunikację.
@aaandrzeeey: racja, dobrze, że zwróciłeś uwagę.
Token jako parametr WS... ale skąd go wygodnie pobierać? Z jakiegoś pola hidden widocznego na każdej stronie? ;P
A jakieś inne podejście bez HTTPS? Czyli się nie obędzie bez tego przy zastosowaniu uniwersalnego WS ze względu na ten token?
Technicznie rzecz biorąc wysyłanie tokena w ciasteczku i headerze to to samo. Content ciasteczek jest wysyłany w specjalnym headerze http://en.wikipedia.org/wiki/HTTP_cookie
Ja to widzę tak:
Klucz wysyłasz w headerze:
My-AccessToken:
W apce webowej możesz ustawiać customowe headery w XmlHttpRequest http://stackoverflow.com/questions/19661157/how-to-add-header-data-in-xmlhttprequest-when-using-formdata Chociaż pewnie używasz czegoś typu jQuery, więc w praktyce będzie to wyglądało inaczej. Np. angular.js bardzo fajnie wspiera takie rzeczy.
W apce webowe tego tokena możesz składować ciasteczku, albo na nowszych
faktycznie, ale jeśli będę odpalał API z Androida to nie ma chyba po co się bawić w udawanie ciasteczek, dodałbym własny AccessToken tak jak mówisz.
A w apce webowej chyba faktycznie będę to trzymał w ciasteczku. Będzie do tego dostęp z JS i po stronie serwera też wygodnie mogę je odczytywać.
Do SPA nie jestem przekonany, ja tu przyszedłem oderwany cepem od Web Formsów ;P Ale chyba zabawy z JS
@krukers: I bardzo dobrze. Życzę Tobie powodzenia.