2009-02-13 11 views
7

To pytanie przyszło mi do głowy po przeczytaniu tego posta: “Common REST Mistakes: Sessions are irrelevant”licencje i sesje relaksującego sposób

Jeśli sesje są rzeczywiście zniechęca do spokojnego aplikacji. Jak poradzisz sobie z licencjami w takiej aplikacji? Mam na myśli konkretnie model licencji współbieżnych, a nie licencje nazwane. tj. klient kupuje licencje X, co oznacza, że ​​aplikacja może zezwalać na logowanie do X użytkowników jednocześnie. Oznacza to, że aplikacja musi posiadać stan dla bieżących zalogowanych użytkowników.

Wiem, że mogę utworzyć zasób zwany licencjami, który ustawi plik cookie lub wygeneruje unikalny identyfikator, a następnie klient będzie musiał wysłać go przy każdym żądaniu. Ale to jest tak samo jak tworzenie sesji, prawda?

Jeśli przyjmuję podejście bezpaństwowe i poprosimy klienta, aby utworzył token uwierzytelniania dla każdego żądania, w jaki sposób aplikacja będzie wiedzieć, kiedy konsumować i wydawać licencję dla tego klienta?

Czy istnieje alternatywa? konkretnie bardziej restrykcyjna alternatywa?

Odpowiedz

4

Pozwól mi spróbować połączyć kropki dla ciebie, zakładając, że poprawnie zinterpretowałem twoje pytanie. Umieszczony link ma poprawną odpowiedź, każde żądanie powinno korzystać z uwierzytelniania HTTP. Jeśli potrzebujesz koncepcji licencji, aby utrzymać określony stan dla swojego użytkownika, najprawdopodobniej możesz powiązać to z użytkownikiem. Masz (zweryfikowaną) nazwę użytkownika, aby przejść. Wystarczy wywołać kontroler dla każdego żądania i zapisać jego stan. Tam masz swoją sesję.

Dane wejściowe z plików cookie nigdy nie powinny być zaufane w przypadku jakichkolwiek istotnych informacji, ale mogą być bardzo przydatne do dodatkowej weryfikacji, takiej jak token zabezpieczający. Myślę, że dodanie losowego pola tokena zabezpieczającego do linków na stronie byłoby spokojnym podejściem do tego. Oczywiście powinna wygasnąć wraz z "sesją".

+1

Kiedy mam skorzystać z licencji na wersję? aby umożliwić zalogowanie się innemu użytkownikowi. Nie chcę, aby licencja była zużywana tylko przez milisekundę, gdy żądanie jest przetwarzane na serwerze, ale przez cały czas, gdy użytkownik jest aktywny. – LiorH

+0

Dlatego należy zachować stan. Sesja/licencja powinna zostać zniszczona, gdy użytkownik kliknie link wylogowania lub po przekroczeniu limitu czasu. (Które może być polem w tabeli bazy danych, jak znacznik czasu last_login, który zostanie zaktualizowany do bieżącego znacznika czasu dla prawidłowych żądań.) –

+0

@Aram Verstegen, powiedziałeś, że dlatego powinien zapisać stan, ale jeśli uratuje stan, czy to nie narusza zasad REST? –

1

Możesz rozważyć przesuwanie problemów związanych z obsługą licencji w dół stosu infrastruktury o jeden poziom. Podobnie jak podejście do programowania zorientowanego na aspekt (AOP). Zamiast obsługiwać go w warstwie aplikacji, możesz go przesłać do warstwy serwera WWW.

Bez znajomości szczegółów infrastruktury trudno jest podać konkretne zalecenie. Używając platformy * nix jako przykładu, logika obsługi licencji może zostać zaimplementowana jako moduł dla serwera HTTP Apache.

To podejście promuje rozdzielanie problemów na stosie infrastruktury. Pozwala każdej warstwie skupić się na tym, co ma na myśli. Warstwa aplikacji nie musi w ogóle martwić się licencjonowaniem, dzięki czemu może skupić się wyłącznie na treści, co z kolei utrzymuje adres URL czysty i "RESTful".

1

Jeśli licencjonowanie jest oparte na równoczesnych użytkownikach, zaimplementowanie protokołu HTTP jest banalne i umożliwi włączenie tylko maksymalnej liczby równoczesnych loginów. Digest ma możliwość przekazywania danych wygasających, więc Twoja sesja może zostać przekroczona.

Stan uwierzytelnienia jest przechowywany przez uwierzytelnienie http i nigdzie indziej, ponieważ jest przezroczysty i niejednolity.

0

Być może bardziej restrykcyjnym sposobem robienia licencji byłoby ograniczenie szybkości obsługi zgłoszeń, a nie liczby równoległych sesji. Śledź liczbę żądań w ciągu ostatniej godziny, a jeśli przekracza liczbę, za którą zapłacił klient, podaj odpowiedź 503 Service Unavailable wraz z tekstem sugerującym, że użytkownik spróbuje ponownie później.