Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [php] saml + octa
jol.us_
post 9.10.2017, 11:22:28
Post #1





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 10.12.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Witam,

Mam serwis na standarowym vhoscie, który ma standardową autoryzację na zwykłych sesjach php - każdy użytkownik ma swoje dane login, email, hasło, imię itd.

Pojawiła się kwestia zupełnie dla mnie obca - Single Sign On.
Firma chce automatycznie logować na stronę użytkowników ze swojej sieci firmowej - używając do tego SAML/Octa.


Czy ktoś się z tym spotkał i wie jak to wygląda?

1. Jak to jest tworzone od strony Octa?
Ktoś dodaje moją stronę jako aplikacje, a następnie dodaje użytkowników z loginem/hasłem z mojego serwisu?


2. Jak i kiedy następuje logowanie.
a) Wchodzi na moją stronę i jest automatycznie zalogowany czy może widzi formularz logowania OCTA?
cool.gif W jaki sposób ja mam rozpoznawać użytkownika i utrzymywać sesję logowania?


Byłem na stronie https://developer.okta.com/use_cases/authentication/ ale totalnie nic z tego nie rozumiem

Proszę jak ktoś zna temat to nich mi pomoże to zrozumieć.



--------------------
run Forest run ...
Go to the top of the page
+Quote Post
Pilsener
post 9.10.2017, 15:43:15
Post #2





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


A co oni rozumieją poprzez "automatyczne logowanie ze swojej sieci firmowej"?
Logowanie przez różne OKTA nie różni się praktycznie niczym od logowania np. przez fb poza tym, że jest to narzędzie w tym wyspecjalizowane i nie zajmuje się niczym innym. Standard OAUTH2 pozostaje niezmienny.
Sugeruję najpierw zapoznać się z opisem standardu OAUTH2 a potem poczytać na stronie OKTA.

Natomiast jeśli chodzi im o takie logowanie, że ktoś loguje się do intranetu (np. poprzez LDAP) a potem wchodzi na stronę firmową i jest już zalogowany, to wymaga to pewnego zachodu - trzeba udostępnić dla aplikacji webowej numery IP osób, które aktualnie są zalogowane do intranetu (poprzez jakieś IP), działa to mniej więcej tak:
1. Na stronę wbija gość, którego IP = 1.2.3.4
2. Strona odpytuje API i dowiaduje się, że pod tym IP jest właśnie zalogowany Jan Nowak
3. Synchronizujesz dane Nowaka i możesz np. ustawić mu sesję
4. W razie konieczności odpytujesz (np. LDAP) o dodatkowe dane

Oczywiście trzeba rozwiązać problemy typu: człowiek wylogowuje się z sieci firmowej, czy wylogowanie z aplikacji ma wylogować z intranetu i tak dalej.
Go to the top of the page
+Quote Post
jol.us_
post 10.10.2017, 12:56:09
Post #3





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 10.12.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Nie mam szukać nowego rozwiązania.
Firma ma u siebie wprowadzone "Single Sign On" przez OKTA i mam to wprowadzić na swojej stronie.

W jaki sposób mam dostosować swój formularz logowania aby używał SAML dla OKTA?








--------------------
run Forest run ...
Go to the top of the page
+Quote Post
Pilsener
post 10.10.2017, 13:47:24
Post #4





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


No to powinno to być bardzo proste:
1. Zakładasz tam konto i tworzysz clienta/aplikację, client = twoja apka, która korzysta z API, każdy client ma id oraz secret (chyba, że korzystasz z tego, co już jest - tu trzeba się dowiedzieć)
2. Odpalasz URL w rodzaju: okta-costam/token/auth?client_id=1_test&response_type=code&redirect_uri=http://twoja-apka.pl
pojawia się formularz logowania, po poprawnej autentykacji przekierowuje na twoja-apka.pl?code=qwerty - gdzie kod to krótkoterminowy (najczęściej kilka sekund) identyfikator, służący do pobrania tokenu w sposób:
3. okta-costam/token?client_id=1_test&client_secret=qwerty&grant_type=authorization_code&code=asdfg&redirect_uri=http://twoja-apka.pl
4. Dostajesz w odpowiedzi JSONA w stylu:
Kod
{"access_token":"MGFiODYwNDFkYWI5ZjA0NTNkNWExMjE0YWViMTA1NGQyMjAzNjIxNjRkODllMTQxYmMwYjQ2M2U2
NmJmODQzMQ","expires_in":43200,"token_type":"bearer","scope":null,"refresh_token":"MjY0ZjI1YTFlOWNhNDQyY2E1NTA2YWEwZmMxMmY4ZDAyZGIwNjgzYWQ5YzllNzg1ZDBlMjM5Yzc2
NjZhYTI5MQ"}

5. Używasz tokenu by odpytać API o usera.

Jakiego używasz frameworka? Jak Symfony to jest masa bundli/sampli do obsługi tego, wystarczy zapewne skonfigurować, pierwsze z brzegu:
https://github.com/okta/samples-php-symfony
https://github.com/aerialship/SamlSPBundle
Go to the top of the page
+Quote Post
jol.us_
post 10.10.2017, 14:10:58
Post #5





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 10.12.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Czyli login i hasło pochodzą z Okta, nie z mojej strony. Tak?
Jest możliwe pobranie jakiś danych zalogowanego usera - imię nazwisko, email?


Nie znalazłem informacji z adresem URL z tokenem o którym piszesz.

Założyłem konto i utworzyłem aplikację. Znalazłem jakiś widget:
https://developer.okta.com/code/javascript/..._sign-in_widget
Ale nie działa mi to. Gdy używam danych logowania z OKTA zwraca mi "Unable to connect to the server. Please check your network connection.

Nie używam frameworka.
Szukam właśnie jakiegoś gotowego przykładu ale nie widzę nic bez frameworka.

Ten post edytował jol.us_ 10.10.2017, 14:11:40


--------------------
run Forest run ...
Go to the top of the page
+Quote Post
Pilsener
post 11.10.2017, 15:06:46
Post #6





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


Cytat
Czyli login i hasło pochodzą z Okta, nie z mojej strony. Tak?
- tak, taka jest idea tego, aby autoryzację wydzielić i współdzielić pomiędzy aplikacjami, user ma jeden email/login i hasło a inne pozostałe dane w zależności od tego, jaka to apka.

Cytat
Jest możliwe pobranie jakiś danych zalogowanego usera - imię nazwisko, email?
- na pewno tego, co gwarantuje standard OAUTH i zapewne API Okta daje możliwość zapisania czegokolwiek, zapewne w układzie klucz->wartość, trzeba przejrzeć API:
https://developer.okta.com/docs/api/resources/oauth2.html

Cytat
Nie znalazłem informacji z adresem URL z tokenem o którym piszesz.
https://developer.okta.com/docs/api/resourc...request-a-token

Cytat
Znalazłem jakiś widget:
Zazwyczaj tego typu konglomeraty dają jakieś klasy PHP (a nawet bundle do Symfony), gotowe widoki, szablony, skrypty JS etc. Nie ma obowiązku używania tego, ale jest to wygodne.

Cytat
Nie używam frameworka.
A jakie tego przyczyny? Teraz zamiast np. dociągnąć bundla do Symfony z obsługą OAUTH2 musisz rozkminić dokumentację protokołu oraz samemu wszystko zaimplementować.
Go to the top of the page
+Quote Post
jol.us_
post 12.10.2017, 10:24:13
Post #7





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 10.12.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Cytat(Pilsener @ 11.10.2017, 16:06:46 ) *
Zazwyczaj tego typu konglomeraty dają jakieś klasy PHP (a nawet bundle do Symfony), gotowe widoki, szablony, skrypty JS etc. Nie ma obowiązku używania tego, ale jest to wygodne.
A jakie tego przyczyny? Teraz zamiast np. dociągnąć bundla do Symfony z obsługą OAUTH2 musisz rozkminić dokumentację protokołu oraz samemu wszystko zaimplementować.


Nie używam bo nie znam frameworka. Gdyby ich gotowe paczki mogły by być przeze mnie użyte to bym nie pisał na forum...
Opis API jest właśnie dla mnie nie zbyt jasny - strasznie rozproszona ta dokumentacja. A ja nie chcę nic zaawansowanego - tylko zalogować użytkownika i pobrać jego dane.
Zwykle z API wysyła się coś CURLem i dostaje się odpowiedź. Tutaj nic mi nie chce działać - żaden przykład z dokumentacji ani nawet też ten ich widget. Działam strasznie po omacku w tym temacie.





--------------------
run Forest run ...
Go to the top of the page
+Quote Post
Pilsener
post 13.10.2017, 08:13:42
Post #8





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


Cytat
Opis API jest właśnie dla mnie nie zbyt jasny - strasznie rozproszona ta dokumentacja
- z dokumentacją zawsze jest problem, jak już jest to często nieczytelna albo po prostu kłamie - trzeba się przyzwyczaić.
Sugeruję popatrzeć w kod aplikacji, które to implementują - na różnych githubach na pewno jest tego sporo - niestety trzeba trochę czasu poświęcić, wtedy wszystko powoli staje się jasne.
Cytat
Nie używam bo nie znam frameworka
- to najwyższy czas poznać, dzisiaj żadnej poważniejszej aplikacji nie robi się bez frameworka.
Go to the top of the page
+Quote Post
jol.us_
post 13.10.2017, 10:13:29
Post #9





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 10.12.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Poznanie frameworka to nie jest kwestia 1/2 dni. A sprawa dla mnie pilna.

Robiłem research i przeglądałem dokumentację.
Mam obecnie coś takiego:

index.php
  1. <?php
  2. $state = "test";
  3. $nonce = "";
  4. $data = array(
  5. 'client_id' => '0oacd7ej5guj3oTbj0h7',
  6. 'response_type' => 'code',
  7. 'response_mode' => 'query',
  8. 'scope' => 'openid profile',
  9. 'redirect_uri' => 'http://localhost/okta/login_callback.php',
  10. 'state' => $state,
  11. 'nonce' => $nonce
  12. );
  13. $query = http_build_query($data);
  14.  
  15. header('Location: ' . 'https://dev-220754.oktapreview.com/oauth2/default/v1/authorize?'.$query);
  16. ?>



login_callback.php
  1. <?php
  2.  
  3. $state = "test";
  4.  
  5.  
  6. if(array_key_exists('state', $_REQUEST) && $_REQUEST['state'] !== $state) {
  7. throw new \Exception('State does not match.');
  8. }
  9.  
  10. if(array_key_exists('code', $_REQUEST)) {
  11. $exchange = exchangeCode($_REQUEST['code']);
  12.  
  13. }
  14.  
  15. function exchangeCode($code) {
  16.  
  17. $client_id = '0oacd7ej5guj3oTbj0h7';
  18. $client_secret = '4qDKVVp5h4JV7uVFt-dSKwMc_sBK8KqffOZZMw0M';
  19.  
  20. $authHeaderSecret = base64_encode( $client_id.':'.$client_secret );
  21. $dane = array(
  22. 'grant_type' => 'authorization_code',
  23. 'code' => $code
  24. );
  25. $query = http_build_query($dane);
  26. $headers = array(
  27. 'Authorization: Basic ' . $authHeaderSecret,
  28. 'Accept: application/json',
  29. 'Content-Type: application/x-www-form-urlencoded',
  30. 'Connection: close',
  31. 'Content-Length: 0'
  32. );
  33. $url = 'https://dev-220754.oktapreview.com/oauth2/default/v1/token?' . $query;
  34. $ch = curl_init();
  35. curl_setopt($ch, CURLOPT_URL, $url);
  36. curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  37. curl_setopt($ch, CURLOPT_HEADER, 0);
  38. curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
  39. curl_setopt($ch, CURLOPT_POST, 1);
  40.  
  41.  
  42. $output = curl_exec($ch);
  43. $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
  44. if(curl_error($ch)) {
  45. $httpcode = 500;
  46. }
  47. curl_close($ch);
  48.  
  49. return json_decode($output);
  50. }



Loguje się poprawnie. Jestem przekierowywany do pliku login_callback.php z wartością code.
Jednak w funckji exchangeCode CURLINFO_HTTP_CODE zwraca Status 0 bool(false)

Na prawdę brak mi już siły. Co robię źle?


--------------------
run Forest run ...
Go to the top of the page
+Quote Post
Pilsener
post 17.10.2017, 07:55:58
Post #10





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


1. Nie łatwiej zamiast CURLa użyć jakiś bibliotek lub nawet dodatków do przeglądarki do pisania requestów do API? Jest szybciej i wygodniej
2. Warto wiedzieć, że na zamianę kodu na token masz zazwyczaj tylko kilka sekund (ile dokładnie to powinno być w dokumentacji)
3. Musisz przede wszystkim okodować obsługę błędów, które zwraca API:
https://developer.okta.com/docs/api/resourc...#list-of-errors
4.
Cytat
Co robię źle?
- nie wiem, bo jestem słaby z CURLA, jednak wygląda na to, że request z jakiś powodów się nie powiódł, pewnie trzeba użyć funkcji curl_error. Obsługę API trzeba dobrze okodować, sprawdzać czy request wykonał się ok, czy API odpowiada i w końcu czy API nie zwróciło błędów i wszystko logować w układzie request - response.
Go to the top of the page
+Quote Post
jol.us_
post 18.10.2017, 11:37:10
Post #11





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 10.12.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Właśnie w tym problem, że nie zwraca błędu. Nic nie zwraca - mam pustą tablicę - może coś źle skonfigurowałem w panelu, nie wiem.
Ale i tak chyba muszę szukać tego od nowa bo to idzie przez bo to jest sposób pobierania danych przez OpenID, a uparto się aby to było w oparciu o SAML.

Wszedłem na https://developer.okta.com/standards/SAML/index
Ale tu juz w ogóle nic nie można znaleźć - bo dokumentacji właściwie nie ma.
Utworzyłem apliację SAML, dostałem jakiś plik certykatu. Jest też jakies URL ktore po wywołaniu wraca do mnie postem z jakimiś zakodowanymi danymi - to chyba dane XML.
Jak to odkodować?


--------------------
run Forest run ...
Go to the top of the page
+Quote Post
Pilsener
post 19.10.2017, 12:57:05
Post #12





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


SAML mi wygląda na jakąś szczególną implementacje SOAPa.
Jak to nie ma dokumentacji?
Jak stworzyć aplikację:
https://developer.okta.com/standards/SAML/s...on_in_okta.html
Jak użyć PHP:
https://developer.okta.com/code/php//simplesamlphp.html

Dają gotowe kompomenty i opis do nich, wystarczy trochę posiedzieć przy tym.
Go to the top of the page
+Quote Post
jol.us_
post 19.10.2017, 14:21:41
Post #13





Grupa: Zarejestrowani
Postów: 132
Pomógł: 0
Dołączył: 10.12.2003
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Aplikację utworzyłem.
Zainstalowałem simplesaml.php i nie za bardzo wiem do czego to mi sie ma przydać.

Nic to nie mówi na temat jak zdekodowac otrzymany xml i jak przebiega komunikacja.
Nic ponad instrukcję jak zainstalować simplesaml i uruchomic na okta na stronie nie ma.



--------------------
run Forest run ...
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 26.04.2024 - 10:18