konto usunięte
Temat: Sesja między PHP a Node.js czy wieloma serwerami - pomysły ?
Powitać,opracowałem sobie prosty mechanizm sesji po to by połączyć aplikację w PHP z Node.js który jest wykorzystany do elementów które muszą działać w czasie rzeczywistym (czaty między pracownikami i tego typu sprawy) i tam gdzie Ajax już by się zupełnie nie nadał (zawsze mogłem użyć Ajax i long polling) czyli do elementów gdzie potrzebny jest push informacji z serwera do klientów.
Chciałem tez by sesję można było rozpocząć zarówno od strony PHP jak i Node.js.
Chciał bym opinię, sugestie i co Wam do głowy przyjdzie na temat tego pomysłu.
Po sprawdzeniu kilku opcji zdecydowałem się na utworzenie mechanizmu sesji za pomocą Redisa. Żeby łatwo było z niej korzystać (i składować dane) postanowiłem za format danych przyjąć JSON. Działa to tak:
1. Przy tworzeniu nowej sesji, zostaje wygenerowany 40-znakowy, losowy ciąg znaków który od tego momentu służy jako ID sesji.
2. Przygotowuje mały obiekt JSON w tej postaci:
{
secret: (...) // 40-znakowy sekretny ciąg generowany przy inicjacji sesji
time: (...) // timestamp
ip: (...) // IP klienta
data: {} // tutaj będą składowane dane, interfejs klasy będzie operował na tym obiekcie
hash: {} // suma kontrolna z id, ip, secret i time
}
3. Ustawiam ciasteczko w kliencie w tej postaci:
DPSID="[id]:[hash]"
4. Przy każdym odwołaniu do serwera time jest odświeżany, zmienia się hash i od nowa ustawione jest ciasteczko.
Teraz - w momencie gdy otwieramy stronę:
1. Skrypt szuka ciasteczka DPSID i odczytuje je
2. Rozbija je wg :. Na dobrą sprawę skoro SID i HASH będą miały ustaloną długość, mogę to wykorzystać nie dając znaku rozbicia.
3. Pobieram z Redisa wartość spod podanego ID
4. Sprawdzam sumę kontrolną
5. Sprawdzam czy IP nadal jest to samo
6. time również będzie wykorzystany by zrobić czasowe wygaśnięcie sesji
7. Zapisywany jest nowy timestamp i odświeżane jest ciasteczko DPSID.
8. Jeżeli wszystko jest OK, wznawiam sesję.
Wybrałem JSON z uwagi na to że łatwo go konwertować z obiektu do ciągu znaków i odwrotnie zarówno w PHP jak i JavaScript.
Redis jest szybki, wygodny i do tego dostępny u mnie na serwerze.
Zabawa z czasem, secret i hash jest po to by trudniej było przejąć sesję poprzez zakoszenie ciasteczka NAWET jeżeli atakujący ma to samo IP czy nawet wie jak generowany jest hash. Ciasteczko jest ważne tylko do następnego requesta.
Zastanawiam się nad wykorzystaniem dodatkowych informacji jak user-agent i podobne.
Wszelkie sugestie z Waszej strony mile widziane. Porady, pomysły itp. Normalnie bym się zbytnio nie przejmował ale chcę opracować taki mechanizm który później mógł bym bez problemu używać zarówno przy współpracy między PHP a Node.js jak i mając do czynienia z architekturą wielo-serwerowa.