Posiadam dwie aplikacje w obrębie jednej domeny. Zrobiłem SSO tak aby z poziomu jednej aplikacji możliwe było logowanie do drugiej.
W pierwszej aplikacji zrobiłem token, który zawiera również nazwę użytkownika.
$token = http://www.php.net/bin2hex(random_bytes(32)).'&'.$user; file_put_contents("token.txt",$token);
$token_code = http://www.php.net/preg_replace('/&.*/s','', $token); $token_user = http://www.php.net/preg_replace('/.*&/s','', $token);
który następnie jest wysyłany za pomocą
$_COOKIE['token'],
http://www.php.net/header("Set-Cookie: CookieToken=$sso_id; Domain=abc.pl; Path=/; Secure;");
Czyli zrobiłeś po prostu sesję (session_start właśnie to robi przy odpowiedniej konfiguracji). Każdy kto zgarnie to cookie będzie mógł się zalogować bez danych. Nie możesz wprowadzić oauth?
Zrobiłem tak aby nikt nie mógł wprowadzić id sesji. Dodatkowo zamknąłem to w obrębie adresu IP.
if(!http://www.php.net/isset($_SESSION['initiate'])) { http://www.php.net/session_regenerate_id(); $new_session_id = http://www.php.net/session_id(); http://www.php.net/session_write_close(); http://www.php.net/session_id($new_session_id); http://www.php.net/session_start(); $_SESSION['initiate'] = 1; }
Nie do końca tak. Każde wywołanie aplikacji podrzędnej powinno trafić do aplikacji głównej (logującej) ze swoim adresem. Dopiero aplikacja logująca decyduje co dalej, sprawdza, czy dany użytkownik jest zalogowany, czy ma prawa do aplikacji, ustala klucz (pary kluczy, token), zakodowanego user-a i odsyła to wszystko do aplikacji podrzędnej. Jakakolwiek zmiana stanu user-a w aplikacji głównej (upłynięcie czasu sesji, wylogowanie, próba Session Fixation) ma skutkować odpowiednimi działaniami w aplikacji podrzędnej. Bez żadnych cookies. Tyle w bardzo krótkiej formie.
@viking podał bezpieczne rozwiązanie.
Taki warunek również jest zrobiony. W momencie wylogowania z aplikacji A token jest kasowany oraz zmienia się id sesji. W aplikacji B jest ustawiony warunek jeżeli brakuje pliku z tokenem oraz id sesji się zmieni następuje również wylogowanie z aplikacji B. Każdorazowe wywołanie aplikacji B sprawdza czy jest plik z tokenem oraz czy id sessji jest równy $_COOKIE['token'] w innym wypadku jest logout. Tak jak wspomniałem dodatkowo zamknąłem to wszystko w obrębie adresu IP.
Jasne wiem że mogę to zrobić za pomocą oauth natomiast chce się trochę pobawić sesją i cookies dlatego tak kombinuje. Może trochę jak koń pod górę ale chce mieć pewność że to co zrobiłem ma sens i jest bezpieczne albo ma to poważne luki i nie ma co się w dalej bawić.
Tego nie robi się na plikach tekstowych z tokenem, przynajmniej ja takich systemów nie znam (nie używam). Wygenerowane tokeny w części aplikacji służącej do autoryzacji użytkownika można zapisać do bazy łącznie z UUID usera i w sesji. Można porównywać wtedy klucze na bieżąco. W plikach tekstowych zawsze istnieje niebezpieczeństwo podejrzenia takiego pliku. W większych systemach używa się nawet dedykowanych maszyn (serwerów autoryzacji) tak jak na przykład u mnie w firmie.
Dzięki za wszystkie sugestie. Wycofałem się z generowania wartości do pliku oraz cookies. Poszedłem po najniższej lini oporu tzn. skoro dwie aplikacje są na tej samej domenie to w aplikacji A zrobiłem tak:
if(!http://www.php.net/isset($_SESSION['data_sso'])) { $_SESSION['data_sso'] = []; $_SESSION['data_sso']['user'] = $user; }
if(http://www.php.net/isset($_SESSION['data_sso'])){ $user = http://www.php.net/isset($_SESSION['data_sso']['user']) ? $_SESSION['data_sso']['user'] : null; //coś tam }
Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)