Strona główna--artykuly--ws-security_epuap

Poradnik integratora czyli, Jak dogadać się z portalem ePUAP przy pomocy protokołu SOAP zabezpieczonego podpisem elektronicznym według specyfikacji ws-security

  1. 1. Wstep
  2. 2. Co to jest ws-security
  3. 3. Co to jest podpis elektroniczny dokumentu XML
  4. 4. Certyfikat wymagany przez ePUAP
  5. 5. Konfiguracja platformy EPUAP i konsoli DRACO na potrzeby Komunikacji przez ws-security
  6. 6. Podpisywanie koperty SOAP według specyfikacji ws-security
  7. 7. Odpytanie ePUAP o uprawnienia, czyli wywołanie usługi decisionQuery
  8. 8. Odpytanie ePUAP o dane zalogowanego użytkownika czyli wywołanie uslugi getUserInfo
  9. 9. Za┼é─ůczniki
  10. 10. Materiały

1. Wstep

W pierwszym artykule z tej serii http://www.extern.pl/artykuly/sso_epuap/ opisa┼éem w jaki spos├│b wykona─ç tzw. SSO czyli jak si─Ö autentykowa─ç w swoim systemie informatycznym za po┼Ťrednictwem portalu ePUAP (ePUAP jest wi─Öc tzw. IDP "identity provider"). Portal ePUAP potrafi zapewni─ç wi─Ökszo┼Ť─ç funkcjonalno┼Ťci do zarz─ůdzania u┼╝ytkownikami co zwalnia nas z konieczno┼Ťci samodzielnego pisania takiej funkcjonalno┼Ťci, przy okazji mamy r├│wnie┼╝ z g┼éowy problem zaufanego certyfikatu. Niestety sam proces autentykacji musi by─ç za┼éatwiony przy pomocy protoko┼éu SAML 2.0 co w wykonaniu portalu ePUAP nie jest niestety tak oczywiste jakby si─Ö mog┼éo wydawa─ç. Opisa┼éem ten proces w poprzedniej cz─Ö┼Ťci artyku┼éu i mam nadziej─Ö ┼╝e zrobi┼éem to wystarczaj─ůco przyst─Öpnie. Niestety lektura poprzedniego artyku┼éu jest wielce po┼╝─ůdana przed rozpocz─Öciem czytania tej cz─Ö┼Ťci.

Celem procesu autentykacji opisanego w pierwszej cz─Ö┼Ťci by┼éo uzyskanie identyfikatora sesji tzw. TGSID. Identyfikator ten by┼é nam potrzebny aby utrzymywa─ç sesj─Ö autentykacyjn─ů z serwerem IDP, jednak to nie koniec zada┼ä tego identyfikatora, jest on r├│wnie┼╝ bardzo przydatny a w┼éa┼Ťciwie to niezb─Ödny w dalszej komunikacji z API WebService portalu ePUAP.

Okazuje si─Ö ┼╝e portal ePUAP udost─Öpnia zaufanym (zalogowanym) u┼╝ytkownikom (tym kt├│rzy maj─ů identyfikator TGSID) ca┼éy szereg us┼éug WebService kt├│rych opis znajduje si─Ö w dokumentacji portalu (sekcja "integratorzy"). Dla mnie najwa┼╝niejszymi funkcjonalno┼Ťciami z tego portalu by┼éo odpytanie o uprawnienia zalogowanego u┼╝ytkownika, odpytanie portalu ePUAP o szczeg├│┼éowe dane osobowe u┼╝ytkownika, podpisanie dokumentu XML profilem zaufanym u┼╝ytkownika.

Niestety okazuje si─Ö ┼╝e o ile pocz─ůtkowa komunikacja z API portalu ePUAP mo┼╝e si─Ö odbywa─ç przy pomocy niepodpisanych kopert protoko┼éu SOAP to niestety ju┼╝ dost─Öp do us┼éug kt├│re s─ů najbardziej interesuj─ůce wymaga aby sekcja body kopert SOAP by┼éa podpisana odpowiednim certyfikatem typu "X.509"

A m├│wi─ůc bardziej po naszemu, w kopercie SOAP musi znajdowa─ç si─Ö nag┼é├│wek "header" zawieraj─ůcy podpis elektroniczny elementu "body" koperty SOAP, w kt├│rym to elemencie jest ju┼╝ ten konkretny dokument xml kt├│ry przesy┼éamy do portalu ePUAP. Dokument ten zwykle jest po prostu XMLowym zapytaniem (nazwa metody i parametry) jakie przekazujemy do portalu ePUAP w nadzieii na w┼éa┼Ťciw─ů odpowied┼║ lub akcj─Ö.

Dokument ten utworzony ┼Ťci┼Ťle wed┼éug dokumentu WSDL opisuj─ůcego wywo┼éywan─ů przez nas us┼éug─Ö musi by─ç podpisany przy pomocy klucza prywatnego kt├│rego odpowiednik publiczny (certyfikat) zna portal ePUAP. Tylko komunikaty podpisane w┼éa┼Ťciwym podpisem s─ů przyjmowane przez portal ePUAP inne s─ů od razu odrzucane i zamiast oczekiwanej tre┼Ťci dostajemy komunikat fault o tre┼Ťci "WSDoAllReceiver: security processing failed " czyli zupe┼énie zgodny z ju┼╝ poznan─ů przezemnie ePUAPow─ů tradycj─ů kt├│r─ů mo┼╝na podsumowa─ç w trzech wszystko wyja┼Ťniaj─ůcych s┼éowach "Co┼Ť nie dzia┼éa" :-).

2. Co to jest ws-security

Hmm, tak po naszemu to mo┼╝na to przedstawi─ç ┼╝e jest to za┼éatanie zupe┼énego braku jakichkolwiek zabezpiecze┼ä w protokole SOAP przez wepchni─Öcie do sekcji "head" koperty SOAP dodatkowych element├│w XML opisuj─ůcych to co si─Ö znajduje w sekcji "body" koperty SOAP. Tak dla zasady musz─Ö wspomnie─ç ┼╝e ws-security zajmuje si─Ö jakby trzema podstawowymi kwestiami bezpiecze┼ästwa us┼éug WebService czyli:

Przy czym nas w kontek┼Ťcie ePUAPu interesuje g┼é├│wnie podpis (signature). Autentykacja wed┼éug specyfikacji ws-security jest typu "Basic authentication" co oznacza przekazywanie loginu i has┼éa otwartym tekstem wi─Öc tw├│rcy ePUAPu s┼éusznie doszli do wniosku ┼╝e lepiej jest do tego u┼╝y─ç protoko┼éu SAML 2.0. Natomiast szyfrowanie jest zapewnione przez protok├│┼é ni┼╝szej warstwy czyli ssl wi─Öc nie ma po co m─Öczy─ç samej warstwy aplikacyjnej tym zadaniem.

Fizycznie podpis przez ws-security wygl─ůda tak ┼╝e w sekcji header koperty SOAP umieszczany jest element o nazwie <Security> w kt├│rym to umieszczane s─ů elementy

3. Co to jest podpis elektroniczny dokumentu XML

Podpisanie dokumentu XML w formacie XAdES to nic innego jak wepchni─Öcie do oryginalnego dokumentu xml dodatkowego elementu <Signature> w kt├│rym to elemencie s─ů zawarte kolejne elementy opisuj─ůce jakie sekcje dokumentu zosta┼éy podpisane <Reference url=""> (bo nie musimy podpisywa─ç ca┼éo┼Ť─çi tylko mog─ů to by─ç podpisywane wybrane elementy dokumentu xml identyfikowane na podstawie ich unikatowych atrybut├│w ID, jakich przekszta┼éce┼ä u┼╝yto podczas generacji tre┼Ťci skr├│tu <Transform Algorithm=""> i jakich algorytm├│w u┼╝yto do generaci skr├│t├│w z podpisywanego elementu <DigestMethod Algorithm="">. Wreszcie warto┼Ťci samego podpisu zawartego w elemencie <SignatureValue>

Sam podpis XAdES nie musi by─ç koniecznie zawarty wewn─ůtrz dokumentu podpisywanego a to jest akurat tylko opcja wymagana przez ws-security u┼╝ywane na portalu ePUAP. Podpis XAdES mo┼╝e by─ç r├│wnie┼╝ umieszczony nawet w oddzielnym pliku czy nawet pod innym adresem url

Co nam ten ca┼éy podpis elektroniczny koperty SOAP w przypadku portalu ePUAP daje. Przede wszystkm uwierzytelnienie naszego systemu. Poniewa┼╝ w trakcie konfiguracji naszej aplikacji (opisane w sekcji "Konfiguracja platformy ePUAP") deklarujemy jakiego certyfikatu b─Ödziemy u┼╝ywali do komunikacji przez ws-security dlatego mo┼╝emy mie─ç pewno┼Ť─ç ┼╝e ePUAP nie pozwoli komu┼Ť podszy─ç si─Ö pod nasz system. Dodatkowo otrzymujemy niezaprzeczalno┼Ť─ç czyli pewno┼Ť─ç ┼╝e nikt nie przejmie naszej komunikacji i modyfikuj─ůc tylko fragmencik przekazu wy┼Ťle polecenie przez nas nie autoryzowane, serwer bezpiecze┼ästwa wykryje taki przypadek poniewa┼╝ podpis nie b─Ödzie poprawnie zweryfikowany z przes┼éan─ů zawarto┼Ťci─ů, wi─Öc ca┼éy komunikat zostanie odrzucony jako b┼é─ůd bezpiecze┼ästwa.

Ca┼éa specyfikacja formatu XAdES jest na tyle rozbudowana ┼╝e nie pokusz─Ö si─Ö tutaj o przedstawianie jej szczeg├│┼éowo. Zainteresowanych niuansami odsy┼éam do w┼éa┼Ťciwej dokumentacji, a my po prostu "damy ePUAPowi co ePUAP wymaga" o w┼éa┼Ťnie.

4. Certyfikat wymagany przez ePUAP

Zgodnie z dokumentacj─ů dost─Öpn─ů na stronie dla integrator├│w na portalu ePUAP do komunikacji z API portalu jest wymagany certyfikat niekwalifikowany serwerowy z rozszerzeniem "uwierzytelnianie klienta" i niestety dla cel├│w produkcyjnych trzeba sobie taki certyfikat wykupi─ç u jakiego┼Ť znanego wystawcy certyfikat├│w. Jednak dla cel├│w testowych i zwi─ůzanych ze wst─Öpnymi procesami integracyjnymi na pro┼║b─Ö integratora systemu zewn─Ötrznego (czyli nas) pracownicy portalu ePUAP mog─ů wygenerowa─ç dla nas w┼éa┼Ťciwy certyfikat. Oczywi┼Ťcie trzeba napisa─ç do nich odpowiedniego maila przekazuj─ůc im zar├│wno swoj─ů uzasadnion─ů pro┼Ťb─Ö jak i dane wymagane do wystawienia takiego certyfikatu (zestaw tych danych jest opisany na portalu ePUAP w podsekcji "Specyfikacja interfejs├│w WSDL" sekcji "integratorzy"). Niestety kombinator├│w (takich jak ja) musz─Ö zmartwi─ç poniewa┼╝ certyfikat wygenerowany samodzielnie nie chce dzia┼éa─ç, prawdopodobnie wymagany jest niestety w┼éa┼Ťciwy podpis na tym certyfikacie czego w┼éasne centrum certyfikacyjne postawione przed chwil─ů na Linuxie nie mo┼╝e zapewni─ç.

Cho─ç na stronie z dokumentacj─ů ePUAPU sekcja "integratorzy" podsekcja "Specyfikacja interfejs├│w WSDL" mo┼╝na ┼Ťci─ůgn─ů─ç certyfikaty ePUAPowe opisane jako "Certyfikaty wykorzystane przy zabezpieczeniu wiadomo┼Ťci SOAP systemu ePUAP:" jednak s─ů to tylko certyfikaty z kluczem publicznym u┼╝ywane przez ePUAP w przypadku gdy to nasz system wystawia jakie┼Ť us┼éugi kt├│re maj─ů by─ç zabezpieczone przez ws-security. M├│wi─ůc inaczej je┼Ťli ePUAP b─Ödzie wywo┼éywa┼é jakie┼Ť us┼éugi z naszego serwisu (np. w przypadku wysy┼éania do nas zawarto┼Ťci skrytek typu "PUSH") to wtedy podpisze swoj─ů komunikacj─Ö przy pomocy kluczy prywatnych powi─ůzanych z tymi certyfikatami a my po stronie metod web naszego serwisu musimy zweryfikowa─ç poprawno┼Ť─ç tych podpis├│w w┼éa┼Ťnie dzi─Öki temu ┼╝e znamy te publiczne certyfikaty wystawiane przez ePUAP.

Je┼Ťli dostaniemy ju┼╝ ten testowy certyfikat, to dostaniemy go prawdopodobnie w zabezpieczonym has┼éem pliku zapisanym w formacie PFX (przynajmniej ja tak dosta┼éem). Jest to format u┼╝ywany przez firm─Ö Microsoft (chyba) do sk┼éadowania certyfikat├│w na serwerze IIS. Dla nas istotne jest jednak to ┼╝e w tym pliku jest zawarty zar├│wno interesuj─ů─çy nas klucz prywatny jak i klucz publiczny w formie certyfikatu. Do naszych cel├│w potrzebujemy jednak tych element├│w w formacie X.509 czyli element├│w opisanych przez "-----BEGIN CERTIFICATE-----" ... "-----END CERTIFICATE-----" dla certyfikatu (klucz publiczny i dane odno┼Ťnie zabezpieczanej instytucji) i "-----BEGIN RSA PRIVATE KEY-----" ... "-----END RSA PRIVATE KEY-----" dla klucza prywatnego. Na szcz─Ö┼Ťcie mo┼╝emy w prosty spos├│b przekonwertowa─ç format pfx do formatu X.509 (plik "pem", "cer", "crt", "der" jak zwa┼é tak zwa┼é) wystarczy mie─ç openssl i wywo┼éa─ç komend─Ö openssl pkcs12 -in certificate.pfx -out certificate.cer -nodes i zaraz po wpisaniu hase┼éka do pliku pfx (powinni┼Ťmy je dosta─ç od osoby kt├│ra generowa┼éa nam klucz) jako plik "certyficate.cer" dostaniemy pi─Ökny plik tekstowy w kt├│rym b─Öd─ů interesuj─ůce nas sekcj─Ö certyfikatu i klucza prywatnego.

5. Konfiguracja platformy EPUAP i konsoli DRACO na potrzeby Komunikacji przez ws-security

Podobnie jak w przypadku procesu autentykacji opertej na SAML (uzyskanie TGSID) nie uda si─Ö nam dogada─ç z ePUAPem przez SOAP chroniony przez ws-security je┼Ťli wcze┼Ťniej nie skonfigurujemy konsoli Draco (ePUAPowy serwer bezpiecze┼ästwa) tak aby mog┼éa nast─ůpi─ç wymiana komunikat├│w zabezpieczonych w┼éa┼Ťciwym podpisem elektronicznym. A podpis elektroniczny jak wiemy jest ┼Ťci┼Ťle zwi─ůzany z certyfikatem bezpiecze┼ästwa czyli kluczem publicznym, kluczem prywatnym i z danymi o w┼éa┼Ťcicielu tych kluczy podpisanymi przez zaufane centrum certyfikacyjne

┼ü─ůcz─ůc si─Ö z serwerem ePUAP a w┼éa┼Ťciwie to z serwerem o nazwie hetmantest (produkcyjny serwer tego typu po prostu nazywa si─Ö hetman) musimy wcze┼Ťniej wykona─ç konfiguracj─Ö tzw. konsoli Draco znajduj─ůcej si─Ö pod adresem https://konsolahetmantest.epuap.gov.pl/DracoConsole Oczywiscie nie dostaniemy si─Ö do niej je┼Ťli nie mamy konta na ePUAP, Konieczne jest r├│wnie┼╝ posiadanie uprawnienia "Administrator aplikacji" inaczej nie b─Ödziemy mogli w┼éa┼Ťciwie skonfigurowa─ç interesuj─ůcych nas ustawie┼ä. Niestety nie dostajemy tego uprawnienia automatyczne i musimy o nie poprosi─ç administrator├│w ePUAP (trzeba wys┼é─ů─ç grzecznego maila z pro┼Ťb─ů o to uprawnienie). Dopiero z tym uprawnieniem mamy mo┼╝liwo┼Ť─ç dodania w konsoli Draco bytu kt├│ry b─Ödzie reprezentowa┼é nasz system zewn─Ötrzny. Byt ten nazywa si─Ö "Aplikacja". Opis jak doda─ç aplikacj─Ö znajduje si─Ö w poprzednim artykule czyli tu,http://www.extern.pl/artykuly/sso_epuap/ nie b─Öd─Ö si─Ö wi─Öc powtarza┼é.

Niestety aby komunikowa─ç si─Ö z ePUAP przy pomocy ws-security nie mo┼╝e by─ç tak jak w przypadku uzyskiwania TGSID ┼╝e aplikacja tak na prawd─Ö mog┼éa by─ç r├│wnie┼╝ skrytk─ů. Niestety ale w tym wypadku musi to by─ç prawdziwa aplikacja do kt├│rej dodania jest konieczne posiadanie uprawnienia "Administrator aplikacji". Moje pr├│by po┼é─ůczenia si─Ö ze skrytk─ů nie udawa┼éy si─Ö pomimo tego ┼╝e skrytka jest wy┼Ťwietlana na li┼Ťcie aplikacji widniej─ůcej w konsoli Draco.

5.1. Dodanie Agenta i powi─ůzanie go z aplikacj─ů

Nowo┼Ťci─ů w stosunku do procesu autentykacji jest to ┼╝e samo dodanie aplikacji nie wystarcza, poniewa┼╝ musimy skonfigurowa─ç co┼Ť co si─Ö nazywa "Agentem". Agent jest to co┼Ť co pilnuje bezpiecze┼ästwa naszej komunikacji z ePUAPem, a inaczej m├│wi─ůc jest to po prostu jaki┼Ť kawa┼éek algorytmu kt├│ry sprawdza czy mamy prawo komunikowa─ç si─Ö z ePUAPow─ů aplikacj─ů i czy tre┼Ť─ç jak─ů wysy┼éamy przez protok├│┼é SOAP jest podpisana w┼éa┼Ťciwym kluczem prywatnym kt├│rego odpowiednik publiczny znajduje si─Ö w konfiguracji tego "Agenta". Taki agent nast─Öpnie mo┼╝e by─ç wykorzystywany przy zabezpieczaniu komunikacji pomi─Ödzy r├│┼╝nymi aplikacjami, jest to dosyc elastyczne rozwi─ůzanie poniewa┼╝ jednym agentem mo┼╝emy zabezpieczy─ç kilka aplikacji albo np. do r├│┼╝nych aplikacji mo┼╝emy stworzy─ç oddzielnych agent├│w jak kto woli. W ka┼╝dym b─ůdz razie taki "Agent" musi by─ç przypisany do aplikacji kt├│r─ů ma chroni─ç.

Dodanie Agenta

Dodania "Agenta" dokonujemy w zak┼éadce "Agenci" trzeba wybra─ç przycisk "Nowy agent" a po wype┼énieniu wymaganych p├│l musimy zapisa─ç dane za pomoc─ů przycisku "Zapisz". Najwa┼╝nejsze jest aby wype┼éni─ç pole przeznaczone na Certyfikat agenta przy pomocy danych pobranych z pliku certyfikatu wygenerowanego nam przez pracownika MSWIA w przypadku serwera testowego, lub przy pomocy certyfikatu kupionego od urz─Ödu certyfikuj─ůcego. Tre┼Ťci─ů kt├│r─ů musimy tu wklei─ç jest tre┼Ť─ç certyfikatu razem z nag┼é├│wkami "-----BEGIN CERTIFICATE-----" ... "-----END CERTIFICATE-----"

Dodanie Agenta do aplikacji

Przypisania "Agenta" do "Aplikacji" dokonuje si─Ö w ekranie zarz─ůdzania aplikacjami. Oczywi┼Ťcie musimy mie─ç wcze┼Ťniej utworzonego tego Agenta i dopiero wtedy b─Ödzie on widoczny w ma┼éym okienku "Pozostali agenci w systemie " i nale┼╝y przenie┼Ť─ç jego nazw─Ö do okienka "Agenci obs┼éuguj─ůcy aplikacj─Ö".

W┼éa┼Ťciwie od tej chwili mo┼╝na by ju┼╝ zaczyna─ç prowadzi─ç komunikacj─Ö z ePUAPem, ja jednak chcia┼éem dodatkowo mie─ç mo┼╝liwo┼Ť─ç przypisania do aplikacji r├│┼╝nych uprawnie┼ä jakie r├│┼╝ni u┼╝ytkownicy mog─ů mie─ç w danej aplikacji zewn─Ötrznej. Aby pobra─ç z ePUAPu informacj─Ö o uprawnieniach u┼╝ytkownika w danej aplikacji z ePUAPu trzeba wywo┼éa─ç us┼éug─Ö o nazwie decisionQuery znajduj─ůc─ů si─Ö pod testowym adresem https://hetmantest.epuap.gov.pl/axis2/services/EngineSAMLDecision. Do tej us┼éugi trzeba wys┼éa─ç zapytanie zgodne z protoko┼éem SAML o nazwie <AuthzDecisionQuery>. Opis wywo┼éania tej us┼éugi b─Ödzie w dalszej cz─Ö┼Ťci tego dokumentu natomiast wcze┼Ťniej aby uzyska─ç efekt w postaci poprawnego pobrania zadeklarowanych uprawnie┼ä warto doda─ç te uprawnienia do aplikacji

5.2. Przypisanie uprawnień do użytkownika

Dodanie uprawnienia do aplikacji

Proces dodawania uprawnienia dla u┼╝ytkownika do aplikacji jest rozbity na kilka etap├│w. Najpierw trzeba doda─ç uprawnienie do aplikacji. Robi si─Ö to w ekranie zarz─ůdzania aplikacjami. Nast─Öpnie trzeba wybra─ç w┼éa┼Ťciw─ů "Grup─Ö aplikacji" potem w┼éa┼Ťciw─ů aplikacj─Ö a potem po prawej stronie zak┼éadk─Ö "Uprawnienia". Tam przy pomocy przycisku "Nowe uprawnienie" mo┼╝na wpisa─ç nazw─Ö uprawnienia i jego opis. Z rzeczy istotnych w tym mom─Öcie warto zrozumie─ç rol─Ö zaznaczenia opcji "Jest widoczny globalnie". Zaznaczenie tej opcji spowoduje ┼╝e uprawnienie to b─Ödzie widoczne dla wszystkich u┼╝ytkownik├│w sprawdzaj─ůcych to uprawnienie w kontek┼Ťcie tej aplikacji. W┼éa┼Ťciwie mo┼╝na przyj─ů─ç ┼╝e zaznaczenie tej opcji jest troch─Ö bez sesu bo w ko┼äcu w ka┼╝dej aplikacji raczej chodzi aby w┼éa┼Ťnie r├│┼╝nicowa─ç uprawnienia r├│┼╝nych grup u┼╝tkownik├│w, ale jest oczywiste ┼╝e w pewnych szczeg├│lnych sytuacjach taka mo┼╝liwo┼Ť─ç mo┼╝e si─Ö przyda─ç.

Dodanie roli

Aby jednak w jakis spos├│b powi─ůza─ç aplikacj─Ö, uprawnienie i u┼╝ytkownika musimy niestety doda─ç pewien tw├│r po┼Ťredni w tym wypadku jest to Rola kt├│ra m├│wi─ůc j─Özykiem bazodanowc├│w b─Ödzie stanowi─ç swego rodzaju tabel─Ö po┼Ťredni─ů w relacji wiele do wielu. Dodanie roli mo┼╝emy zrobi─ç w ekrania zarz─ůdzania rolami gdzie w zak┼éadce "Konfiguracja" przy pomocy przycisku "Nowa rola" mo┼╝emy doda─ç now─ů rol─Ö. Cho─ç wydaje si─Ö teoretycznie ┼╝e nie musimy dodawa─ç nowej roli poniewa┼╝ na li┼Ťcie r├│l s─ů ju┼╝ jakie┼Ť role np. "Rola domy┼Ťlna" to jednak wydaje mi si─Ö ┼╝e warto zdefiniowa─ç sobie now─ů rol─Ö okre┼Ťlaj─ůc─ů nam specyfik─Ö danej grupy uprawnie┼ä w aplikacji, pozwoli nam to zachowa─ç wi─Ökszy porz─ůdek.

Powi─ůzanie u┼╝ytkownika z rol─ů

Maj─ůc ju┼╝ rol─Ö mo┼╝emy okre┼Ťli─ç jakie konta (u┼╝ytkownicy) s─ů przypisani do tej roli. Wybieramy wi─Öc teraz zak┼éadk─Ö "Konta" gdzie z pola "Wszystkie konta" do pola "Konta przypisane do roli" przenosimy u┼╝ytkownika kt├│ry ma by─ç przypisany do tej roli. Poni┼╝ej jest r├│wnie┼╝ mo┼╝liwo┼Ť─ç przypisania do tej roli ca┼éych grup u┼╝ytkownik├│w, co te┼╝ mo┼╝e by─ç bardzo wygodn─ů opcj─ů przy konieczno┼Ťci zarz─ůdzania bardziej rozbudowanymi modelami autoryzacji.

Przypisanie aplikacji do roli

W dalszej kolejno┼Ťci musimy okre┼Ťli─ç jakie aplikacje s─ů powi─ůzane z t─ů rol─ů. Przechodzimy wi─Öc do zak┼é─ůdki "Aplikacje". Wybieramy przycisk pojedynczego wyboru (radiobutton) o nazwie "Aplikacje zdefiniowane w organizacji" a nast─Öpnie wybieramy w┼éa┼Ťciw─ů grup─Ö organizacji. Teraz z pola "Pozosta┼ée aplikacje" do pola "Aplikacje przydzielone do roli" mo┼╝emy przesun─ů─ç nasz─ů aplikacje wi─ů┼╝─ůc j─ů tym samym z t─ů okre┼Ťlon─ů rol─ů.

Powi─ůzanie roli i uprawnie┼ä

Zosta┼éo nam ju┼╝ tylko powi─ůzanie roli z uprawnieniami i aplikacjami. Cho─ç mo┼╝e si─Ö wydawa─ç ┼╝e powinni┼Ťmy ju┼╝ mie─ç powi─ůzanie pomi─Ödzy aplikacj─ů u┼╝ytkownikiem a uprawnieniem, poniewa┼╝ na ekranie zarz─ůdzania aplikacjami dodawali┼Ťmy uprawnienie wybieraj─ůc wcze┼Ťniej nasz─ů aplikacje a na ekranie zarz─ůdzania rolami dodawali┼Ťmy do roli i konto u┼╝ytkownika jak i aplikacje, tak jednak nie jest. Dopiero zrobienie powi─ůzania pomi─Ödzy kontem aplikacj─ů i uprawnieniem za pomoc?? roli przynosi efekt taki ┼╝e za pomoc─ů us┼éugi decisionQuery mo┼╝emy pobra─ç informacje o posiadaniu przez zalogowanego u┼╝ytkownika konkretnego uprawnienia.

Id─ůc za ciosem po┼é─ůczmy teraz rol─Ö, aplikacj─Ö i uprawnienie. Je┼Ťli ci─ůgle jeste┼Ťmy w ekranie zarz─ůdzania rolami wybieramy zak┼éadk─Ö "Uprawnienia" nast─Öpnie wybieramy pole typu "radiobutton" "Aplikacje zdefiniowane w organizacji". Nast─Öpnie wybieramy w┼éa┼Ťciw─ů grup─Ö aplikacji, potem wybieramy nasz─ů aplikacj─Ö w kt├│rej wcze┼Ťniej dodawali┼Ťmy te uprawnienia. Dopiero teraz zobaczymy po lewej stronie w polu "Pozosta┼ée uprawnienia" list─Ö mo┼╝liwych do wyboru uprawnie┼ä. i teraz przy pomocy przycisk├│w strza┼éek mo┼╝emy przenie┼Ť─ç uprawnienia kt├│re chcemy przypisa─ç temu u┼╝ytkownikomi (lub jakie┼Ť─ç grupie u┼╝ytkownik├│w) do pola "Uprawnienia przypisane do roli". W tym mom─Öcie chyba sta┼éo si─Ö jasne jak─ů rol─Ö pe┼éni┼éo definiowanie uprawnie┼ä w ekranie zarz─ůdzania aplikacjami. Chodzi┼éo tam o wszystkie uprawnienia jakie tylko s─ů mo┼╝liwe do przypisania w tej konkretnej aplikacji. A ju┼╝ konkretne przypisanie uprawnienia do u┼╝ytkownika (za po┼Ťrednictwem roli oczywi┼Ťcie) nast─Öpuje dopiero na zak┼éadce "Uprawnienia" w ekranie zarz─ůdzania rolami.

Przyznam si─Ö ┼╝e pocz─ůtkowo tak skomplikowany system przyznawania uprawni─Ö┼ä budzi┼é u mnie pewne zdziwienie, ale zrozumia┼éem ┼╝e ma to swoje uzasadnienie wyra┼╝aj─ůce si─Ö w du┼╝ej elastyczno┼Ťci przyj─Ötego przez ePUAP mechanizmu przydzielania uprawnie┼ä. No niestety co┼Ť za co┼Ť, czyli wi─Öksza elastyczno┼Ť─ç kosztem bol─ůcej g┼éowy przy pr├│bie zrozumienia i skonfigurowania tego mechanizmu.

6. Podpisywanie koperty SOAP według specyfikacji ws-security

6.1. Wygl─ůd podpisanej koperty SOAP

Pe┼én─ů specyfikacj─Ö standardu ws-security opracowan─ů przez organizacj─Ö standaryzacyjn─ů OASIS mo┼╝na znale┼Ť─ç np. tu http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0.pdf Jak zwykle w przypadku takich dokument├│w znacznie lepiej si─Ö je czyta je┼Ťli ju┼╝ przynajmniej troch─Ö wiemy o co chodzi, niestety znajomo┼Ť─ç j─Özyka Angielskiego r├│wnie┼╝ sie przydaje bo z nieznanych mi przyczyn ta specyfikacja nie zosta┼éa opracowana po Polsku :-) Oto przyk┼éad wygl─ůdu podstawowej koperty SOAP u┼╝ywanej przy wymianie informacji z portalem ePUAP przez ws-security

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
	<SOAP-ENV:Header>
		<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" SOAP-ENV:mustUnderstand="1">
			<wsse:BinarySecurityToken wsu:Id="BinSecTokenId" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">
				UjEhMB8GCSqGSIb3DQEJARYSZS5oZWJkYUBhcnIuZ292LnBsMR4wHAYDVQQEExVB
				Z2VuY2phIFJ5bmt1IFJvbG5lZ28xHjAcBgNVBCoTFUFnZW5jamEgUnlua3UgUm9s
				...
				bmVnbzCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAm1b9s+mCbAxaschiFxzZ
				7cPSdJZ9oiiGuSAyFEXx89T4JNklPiwCAo3drFTElqzaLBRUU8ptJ40FnADyw1Fr
				D1g59HjifffLN6WY9Zso8gMCAwEAAaMaMBgwCQYDVR0TBAIwADAL=
			</wsse:BinarySecurityToken>
			<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
				<ds:SignedInfo>
					<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
					<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
					<ds:Reference URI="#SoapBodyId">
						<ds:Transforms>
							<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
						</ds:Transforms>
						<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
						<ds:DigestValue>
							xds4fIZPsgdfg45334sXDr35eewfIA=
						</ds:DigestValue>
					</ds:Reference>
					<ds:Reference URI="#TimeStampId">
						<ds:Transforms>
							<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
						</ds:Transforms>
						<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
						<ds:DigestValue>
							o1sgs4RnJre543tg33Wsaa56sNww55yhY=
						</ds:DigestValue>
					</ds:Reference>
				</ds:SignedInfo>
				<ds:SignatureValue>
					gtrewrt343422f34rtfeagg5r4554yh66g6th54qw34EeTm5HAmRa2NnY8Wrger4QJcmsW8+jxi4suxgt4544ttg5Xrw=
				</ds:SignatureValue>
				<ds:KeyInfo>
					<wsse:SecurityTokenReference>
						<wsse:Reference URI="#BinSecTokenId"/>
					</wsse:SecurityTokenReference>
				</ds:KeyInfo>
			</ds:Signature>
			<wsu:Timestamp wsu:Id="TimeStampId">
				<wsu:Created>
					2011-07-26T20:31:46Z
				</wsu:Created>
				<wsu:Expires>
					2011-07-26T21:31:46Z
				</wsu:Expires>
			</wsu:Timestamp>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body wsu:Id="SoapBodyId">
		BODY CONTENT
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Opisz─Ö w kilku zdaniach o co chodzi. Prawdopodobnie je┼Ťli mieli┼Ťcie ju┼╝ do czynienia z protoko┼éem SOAP bez trudu rozpoznacie podstawowe ramy koperty SOAP. Naszym celem jest podpisanie zawarto┼Ť─çi sekcji <body> koperty SOAP. Portal ePUAP oczekuje od nas ┼╝e dostarczymy mu ten podpis w sekcji <head> w ┼Ťrodku znacznika <Security>. W znaczniku <Security> potrzebujemy umie┼Ťci─ç trzy g┼é├│wne znaczniki czyli.

Elementy <BinarySecurityToken> i <Timestamp> musimy zrobi─ç niestety sami na piechot─Ö modyfikuj─ůc kopert─Ö SOAP wygenerowan─ů dla nas przez bibliotek─Ö Nusoap. Natomiast (i to jest bardzo dobra dla nas nowina) element <Signature> razem z identyfikatorami do body i timestamp mo┼╝e dla nas wygenerowa─ç biblioteka Xmlseclibs. Niestety biblioteka ta nie potrafi zrobi─ç dla nas elementu <SecurityTokenReference> tak wi─Öc ten element podobnie jak elementy <BinarySecurityToken> i <Timestamp> musimy zrobic sami.

Warty odnotowania w tym miejscu jest fakt ┼╝e element <BinarySecurityToken>, kt├│ry powinien zawiera─ç certyfikat z kluczem plublicznym musi by─ç wype┼éniony sam─ů warto┼Ťci─ů binarn─ů klucza czyli albo trzeba programistycznie albo r─Öcznie w edytorze (je┼Ťli certyfikat podajemy jako string) wyci─ů─ç z certyfikatu nag┼é├│wek "-----BEGIN CERTIFICATE-----" i stopk─Ö "-----END CERTIFICATE-----". Natomiast wyci─Ötej ju┼╝ tre┼Ťci nie nale┼╝y dodaktkowo poddawa─ç kodowaniu base64 poniewa┼╝ cia┼éo certyfikatu ju┼╝ jest tym sposobem zakodowane.

6.2. Implementacja w języku PHP podpisania koperty SOAP według standardu ws-security.

Nie bardzo wiem jak si─Ö zabra─ç za opisywanie funkcji do podpisywania koperty SOAP. Jest w niej po┼é─ůczenie kilku technik. Biblioteka Nusoap wygeneruje nam podstawow─ů kopert─Ö SOAP dopisuj─ůc przy pomocy metody serializeEnvelope() do elementu head interesujace nas elementy <BinarySecurityToken> i <Timestamp> kt├│re sami tworzymy wype┼éniaj─ůc je w┼éa┼Ťciwymi warto┼Ťciami. Zawarto┼Ť─ç kt├│r─ů mamy przekaza─ç podpisan─ů do portalu ePUAP przekazujemy metodzie serializeEnvelope() jako pierwszy parametr $requestContent. Metoda serializeEnvelope() dokona po┼é─ůczenia przekazywanych tre┼Ťci, czyli to co ma si─Ö znale┼Ť─ç w sekcji <body> i <head> i zwr├│ci nam ci─ůg znakowy reprezentuj─ůcy przygotowan─ů kopert─Ö SOAP.

Korzystaj─ůc z metody serializeEnvelope() musimy pami─Öta─ç ┼╝e musimy ustawi─ç w┼éa┼Ťciwy styl koperty i styl parametr├│w. Poniewa┼╝ niestety niekt├│re us┼éugi web oferowane przez portal ePUAP wymagaj─ů formatowania sekcji <body> wed┼éug zasady "document\literal" a niekt├│re wed┼éug "rpc\literal" dlatego nasza metoda callSecRequest maj─ůca by─ç dosy─ç uniwersaln─ů warstw─ů opakowuj─ůca w ws-security to co ePUAP chce uzyska─ç, musi w formie parametr├│w "style" i "use" uzyskiwa─ç w┼éa┼Ťciwe warto┼Ťci czy dla "$style" czyli "document" lub "rpc" i dla "$use" czyli "encoded" lub "literal". Cho─ç w przypadku ePUAPu nie znalaz┼éem przypadku u┼╝ycia parametr├│w formatowanych jako "encoded"

Ca┼éa ta pracowicie przygotowana koperta SOAP nie jest jeszcze kompletna tak wi─Öc aby nie grzeba─ç si─Ö bezpo┼Ťrednio w napisach, wczytamy nasz dokument przy pomocy metody $doc->loadXML($soapEnvelope); do obiektu DOMDocument reprezentuj─ůcego nam struktur─Ö XML w postaci drzewa na kt├│rym przy pomocy standardowych metod obs┼éugi drzewa DOM b─Ödziemy dokonywali dopisywania interesuj─ůcych nas element├│w i atrybut├│w.

Natomiast biblioteka Xmlseclibs dopisze nam do tej koperty element <Signature> kt├│ry musi si─Ö znale┼Ť─ç pomi─Ödzy elementami <BinarySecurityToken> i <Timestamp>. Dopisanie to wykona nam metoda $objDSig->insertSignature($securityNode,$timestampNode); kt├│rej jako parametry przekazujemy dwa elementy drzewa DOM. Pierwszy z parametr├│w okre┼Ťla w jakim elemencie ma si─Ö znale┼Ť─ç element <Security>. Natomiast drugi parametr metody insertSignature() okre┼Ťla przed jakim elementem (w tym wypadku chodzi o Timestamp) element Signature ma by─ç umieszczony (kolejno┼Ť─ç umieszczenia jest wa┼╝na).

Dalej przy pomocy obiektu DOMXPath i jego metody query zajmujemy si─Ö znalezieniem interesuj─ůcych nas element├│w do kt├│rych musimy dopisa─ç w┼éa┼Ťciwe identyfikatory w atrybutach URI i Id. Tworzymy r├│wnie┼╝ za pomoc─ů metody createElementNS() element SecurityTokenReference i wype┼éniamy atrybut URI w┼éasciw─ů warto┼Ťci─ů do atrybutu Id elementu BinarySecurityToken

O ile referencj─Ö SecurityTokenReference do elementu BinarySecurityToken musimy sami utworzy─ç, to na szcz─Ö┼Ťcie w przypadku referencji do elementu "body" i "timestamp" mo┼╝emy je utworzy─ç przy pomocy biblioteki xmlseclibs. Pomo┼╝e nam w tym metoda $objDSig->addReference($bodyNode, XMLSecurityDSig::SHA1,NULL,array('prefix'=>'wsu','prefix_ns'=>$wsuNamespace)); i $objDSig->addReference($timestampNode, XMLSecurityDSig::SHA1,NULL,array('prefix'=>'wsu','prefix_ns'=>$wsuNamespace)); kt├│re zrobi─ů to za nas. Musimy tylko wskaza─ç tym metodom do jakiego elementu ma si─Ö odnosi─ç referencja. Warta zauwa┼╝enia w tym przypadku jest r├│wnie┼╝ konieczno┼Ť─ç jawnego zmuszenia tych metod za pomoc─ů tablicy z elementami "prefix" i "prefix_ns" aby atrybut "Id" wstawiany do elementu na kt├│ry wskazuje referencja by┼é z w┼éa┼Ťciwej przestrzeni nazw "wsu" (bez tego drobnego szczeg├│┼éu nie dogadamy si─Ö przez ws-security z ePUAP, a m├│wi─ůc bardziej dok┼éadnie z niekt├│rymi metodami si─Ö dogadamy a z niekt├│rymi nie. M├│wi─ůc jeszcze bardziej dok┼éadniej, prefixu przestrzeni nazw "wsu" w atrybucie Id wymagaj─ů us┼éugi odpowiedzialne za podpisywanie dokument├│w xml profilem zaufanym, ale poniewa┼╝ pozosta┼éym us┼éugom ten prefix nie przeszkadza wi─Öc do wszystkich us┼éug mo┼╝na u┼╝ywa─ç tej samej wersji metody)

	function callSecRequest($serviceUrl,$serviceMethod,$requestContent,$pubKey,$privKey,&$msg,$style='document',$use='literal')
	{
		require_once(xmlseclibs.php');
		require_once(Nusoap.php');
		$client=new nusoap_client($serviceUrl);
		$client->soap_defencoding = 'UTF-8';
		$client->decode_utf8 = true;
		$client->http_encoding = 'UTF-8';
		$client->xml_encoding = 'UTF-8';
		//$client->setHTTPProxy($proxyServer,$proxyPort,$proxyUser,$proxyPassword');  //prosz─Ö u┼╝y─ç w przypadku konieczno┼Ťci ┼é─ůczenia si─Ö z internetem przez serwer proxy
		$client->setCurlOption(CURLOPT_SSLVERSION, 3);
		$securityStart="<wsse:Security \n"
						."xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\"\n"
						."xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\"\n"
						."SOAP-ENV:mustUnderstand=\"1\">\n";
		$securityEnd="</wsse:Security>\n";
		$BinarySecurityToken="<wsse:BinarySecurityToken \n"
							."wsu:Id=\"binarytoken\" \n"
							."ValueType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3\" \n"
							."EncodingType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary\">\n"
							.implode("\n",array_slice(explode("\n",$pubKey),1,-1))  //a tu wycinamy napisy BEGIN CERTYFICATE i END CERTYFICATE ponieważ EPUAP oczekuje BinarySecurityToken jako base64 bez tych nagłówków
							."</wsse:BinarySecurityToken>\n";	
		$timestamp = 	"<wsu:Timestamp>"
						."<wsu:Created>".getTimestamp()."</wsu:Created>"
						."<wsu:Expires>".getTimestamp(60*60)."</wsu:Expires>"  //przesuniecie o godzin─Ö
						."</wsu:Timestamp>";	
						
		$sheaders = $securityStart.$BinarySecurityToken.$timestamp.$securityEnd; //komponujemy dodatek "security" który zostanie umieszczony w nagłówku SOAP:Header
		
		$soapEnvelope = $client->serializeEnvelope($requestContent, $sheaders, array(), $style, $use);  //tworzymy ca┼é─ů kopert─Ö SOAP z zawartym tam nag┼é├│wkiem (jeszcze nie podpisanym i nie s─ů przydzielone r├│wnie┼╝ referencje
		//w tym momecie mamy ju┼╝ wst─Öpnie utworzon─ů kopert─Ö SOAP z zawarto┼Ťci─ů SOAP:BODY jednak nie jest jeszcze w pe┼éni utworzony nag┼é├│wek security ani nie jest tam wstawiony podpis kt├│re b─Ödzie wstawiony tam w elemencie "signature" brakuje r├│wnie┼╝ referecji wskazuj─ůcych kt├│re elementy koperty SOAp s─ů podpisane
		//dlatego teraz zajmiemy si─Ö dalszym wstawianiem odpowiednich danych do elementu security.
		$doc = new DOMDocument();
		$doc->loadXML($soapEnvelope); //ca┼é─ů kopert─Ö soap wczytujemy do drzewa dom i na tym drzewie b─Ödziemy ju┼╝ rze┼║bi─ç
		//znajdujemy element body aby dodac do niego referencje poniewaz tylko body bedziemy podpisywali
		$xp = new DOMXPath($doc);
		$wsseNamespace = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd';
		$wsuNamespace = 'http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd';
		//musimy zarejestrowa─ç w┼éa┼Ťciwe namespaces z prefixami aby zapytania xpath umia┼éy znale┼Ť─ç w┼éa┼Ťciwe w─Öz┼éy 
		$xp->registerNamespace('SOAP-ENV', 'http://schemas.xmlsoap.org/soap/envelope/'); //namespace sekcji body
		$xp->registerNamespace('wsse',$wsseNamespace); //namespace node security
		$xp->registerNamespace('wsu',$wsuNamespace);
		$xp->registerNamespace('ds',XMLSecurityDSig::XMLDSIGNS);

		$bodyNode = $xp->query('//SOAP-ENV:Body')->item(0);
		if($bodyNode)									//znale┼║li┼Ťmy element soap:body mozemy przypisa─ç mu id i doda─ç do niego referencje w elemencie "Signature"->"SignedInfo"->"Reference[URI]" 
		{
			//echo "jest BODY";
			$objDSig = new XMLSecurityDSig();			//tworzymy obiekt za pomoc─ů kt├│rego b─Ödziemy podpisywali kopert─Ö SOAP
			$objDSig->setCanonicalMethod(XMLSecurityDSig::EXC_C14N);
			$objDSig->addReference($bodyNode, XMLSecurityDSig::SHA1,NULL,array('prefix'=>'wsu','prefix_ns'=>$wsuNamespace));  //dodajemy referencje do body mo┼╝emy tu u┼╝y─ç gotowej funkcji z biblioteki "xmlseclibs"

			//teraz dodamy referencj─Ö do elementu Timestamp opisuj─ůcego moment czasowy podpisu
			$timestampNode = $xp->query('//wsu:Timestamp')->item(0);
			if($timestampNode)
				$objDSig->addReference($timestampNode, XMLSecurityDSig::SHA1,NULL,array('prefix'=>'wsu','prefix_ns'=>$wsuNamespace));
			$objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type'=>'private'));
			$objKey->loadKey($privKey);   //tworzymy obiekt klucza prywatnego, w tym wypadku odczytujemy go z konfiguracji
			$objDSig->sign($objKey);							//podpisujemy kopert─Ö SOAP kluczem prywatnym
			//$objDSig->add509Cert($pub_key);\				
			//znajdujemy element do kt├│rego wstawimy sekcj─Ö podpisu w tym wypadku jest to Security
			$securityNode = $xp->query('//wsse:Security')->item(0);							
			if($securityNode)
			{
				//echo "jest Security node";
				//teraz musimy doda─ç w┼éa┼Ťnie wygenerowany podpis (na podstawie referecji do zewn─Ötrzego obiektu) do ca┼éo┼Ť─çi koperty SOAP
				$timestampNode = $xp->query('//wsu:Timestamp')->item(0);
				if($timestampNode)
					$objDSig->insertSignature($securityNode,$timestampNode);  //wstawiamy podpis do węzła "Security" ale ma być umieszczony przed węzłem "TimeStamp" (to ważne aby był przed nim)
					//$objDSig->appendSignature($securityNode);
					//Teraz ustawimy referencje do BinarySecurityToken niestety poniewa┼╝ funkcja addRefInternal jest prywatna nie mo┼╝emy jej st─ůd wywo┼éa─ç i musimy dodanie atrybutu reference zrobi─ç na piechot─Ö
				$binarySecurityTokenNode = $xp->query('//wsse:BinarySecurityToken')->item(0);
				if($binarySecurityTokenNode)
				{
					$uri = XMLSecurityDSig::generate_GUID();
					//echo "jest BinarySecurityToken";
					$binarySecurityTokenNode->setAttributeNS($wsuNamespace,'Id', $uri); //dodajemy atrybut Id do BinarySecurityToken aby potem u┼╝y─ç tego samego identyfikatora przy dodawaniu referencji w elemencie securityTokenReference
					$keyInfoNode = $xp->query('//ds:KeyInfo')->item(0);
					if(!$keyInfoNode)
					{
						$signatureNode = $xp->query('//ds:Signature')->item(0);	
						$keyInfoNode = $doc->createElementNS(XMLSecurityDSig::XMLDSIGNS,'ds:KeyInfo');
						if($signatureNode)
							$signatureNode->appendChild($keyInfoNode);
					}
					$securityTokenReferenceNode = $xp->query('//wsse:SecurityTokenReference')->item(0);
					if($keyInfoNode && ! $securityTokenReferenceNode)
					{
						$securityTokenReferenceNode = $doc->createElementNS($wsseNamespace, 'wsse:SecurityTokenReference');
						$referenceNode = $doc->createElementNS($wsseNamespace,'wsse:Reference');
						$referenceNode->setAttribute("URI", '#'.$uri);         //dodajemy teraz do referencji ten sam identyfikator co jest w BinarySecurityToken z elementu Security kt├│ry w┼éa┼Ťciwie to nie wchodzi do podpisu
						$securityTokenReferenceNode->appendChild($referenceNode);
						$keyInfoNode->appendChild($securityTokenReferenceNode);
						//$objDSig->addRefInternal($securityTokenReferenceNode,$binarySecurityTokenNode, XMLSecurityDSig::SHA1);
					}
				}
				$soapEnvelope = $doc->saveXML();
			}//if($securityNode)
			else
			{
				$msg .="Nie odnaleziono elementu wsse:Security";	
			}
		}//if($bodyNode)
		else
		{
			$msg .="Nie odnaleziono elementu SOAP-ENV:Body";
		}				
		//echo $soapEnvelope;	
		$result2  = $client->send($soapEnvelope, $serviceMethod);   //wysyłamy kopertę SOAP
		if($client->fault)
		{
			$msg .= "ERROR przy wysyłaniu metody ".$serviceMethod." :".$client->fault." ".var_export($result2,true);
			//echo  'Error: '.$client->fault;
			//print_r($result2);	
			//echo '<h2>Request</h2>';
			//echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
			//echo '<h2>Response</h2>';
			//echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
			// Display the debug messages
			//echo '<h2>Debug</h2>';
			//echo '<pre>' . htmlspecialchars($client->debug_str, ENT_QUOTES) . '</pre>';		
		}
		else
		{
			if ($client->getError())
			{		
				$msg .= "ERROR przy wysyłaniu metody ".$serviceMethod." :".$client->getError()." ".var_export($result2,true);	
				//echo 'Error2: '.$client->getError();
				//print_r($result2);
				//echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
			}
			else   //uda┼éo si─Ö wi─Öc zwracamy wynik jaki dostali┼Ťmy od klienta
			{				
				//echo '<h2>Result</h2><pre>';
				//print_r($result2);				
				//echo '</pre>';
				//echo '<h2>Request</h2><pre>';
				//echo '<pre>' . htmlspecialchars($client->request, ENT_QUOTES) . '</pre>';
				//echo '<h2>Response</h2><pre>';
				//echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';
				//print_r($result2);
				if(isset($result2['faultcode']))
				{
					$msg .=  'faultcode='.$result2['faultcode'].' faultstring='.$result2['faultstring'].' detail='.$result2['detail'];
					return false;
				}
				return $result2;				
			}
		}
		return false;						
	}//callSecRequest

Gdy mamy ju┼╝ przygotowan─ů w┼éa┼Ťciw─ů struktur─Ö koperty SOAP zapisujemy (serializujemy) j─ů do zmiennej przy pomocy metody $soapEnvelope = $doc->saveXML();, w┼éa┼Ťciwie tylko po to aby od razu wys┼éa─ç nasz─ů pracowicie przygotowan─ů kopert─Ö SOAP przy pomocy metody $client->send($soapEnvelope, $serviceMethod); na serwer ePUAP. Je┼Ťli nie otrzymamy b┼é─Ödu zg┼éoszonego b─ůd┼║ przez serwer b─ůdz przez obiekt klienta, to wynikiem dzia┼éania metody$client->send() b─Ödzie tablica (array) zawieraj─ůca tre┼Ť─ç zale┼╝n─ů od tego jaki zestaw danych zwraca nam wywo┼éywana przez nas us┼éuga web.

Musz─Ö si─Ö w tym miejscu poskar┼╝y─ç ┼╝e w trakcie mojej nier├│wnej walki z ePUAPem spotka┼éa mnie przykra, przykro┼Ť─ç :-) mianowicie nagle bez przyczyny moje metody przesta┼éy si─Ö dogadywa─ç z serwerem zwracaj─ůc dziwny b┼é─ůd protoko┼éu ssl. Po naprawde trwaj─ůcej ca┼éy dzie┼ä walce z kodem doszed┼éem do wniosku ┼╝e win─Ö za to ponosi niezgodno┼Ť─ç wersji protoko┼éu SSL u┼╝ywanej przez serwer i mojego klienta "CURL" wykorzystywanego z kolei przez bibliotek─Ö "Nusoap". CURL powinien automatycznie rozpozna─ç wersj─Ö SSLa u┼╝ywana przez serwer i ju┼╝ potem zgodnie z t─ů wersj─ů prowadzi─ç dalsz─ů komunikacj─Ö, ale CURL odmawia┼é wsp├│┼épracy i ci─ůgle pr├│bowa┼é dogada─ç si─Ö z serwerem rozmawiaj─ůcym w SSLv3 przy pomocy SSLv2. Sytuacj─Ö uratowa┼éo po prostu ustawienie CURLowi przy pomocy metody $client->setCurlOption(CURLOPT_SSLVERSION, 3); wersji SSLv3 na sztywno. Dopiero p├│┼║niej dowiedzia┼éem si─Ö w┼éa┼Ťciwie przypadkiem co si─Ö sta┼éo. Ot├│┼╝ okaza┼éo si─Ö ┼╝e po prostu ePUAP w pewnym mom─Öcie przeszed┼é na SSLv3 o czym nie wiedzia┼éem. Dla administrator├│w ePUAP by┼éo to przestawienie jednego konfiguracyjnego parametru, a dla mnie to by┼é ca┼éy dzie┼ä rwania w┼éos├│w z g┼éowy "o matko co ja powiem dyrektorowi przecie┼╝ ju┼╝ si─Ö pochwali┼éem ┼╝e uda┼éo mi si─Ö w ko┼äcu z nimi po┼é─ůczy─ç :-\"

7. Odpytanie ePUAP o uprawnienia, czyli wywołanie usługi decisionQuery

O ile sama mo┼╝liwo┼Ť─ç podpisania koperty SOAP przez ws-security jest sama w sobie nikomu nie potrzebna to ju┼╝ wywo┼éanie dzi─Öki temu us┼éugi na serwerze ePUAP owszem (a przynajmniej mam nadziej─Ö ┼╝e komu┼Ť si─Ö to przyda) Na pierwszy ogie┼ä we┼║miemy us┼éug─Ö decisionQuery udost─Öpnian─ů przez ePUAP. Us┼éuga ta umo┼╝liwia odpytanie si─Ö ePUAPu o konkretne uprawnienie konkretnego u┼╝ytkownika do konkretnej aplikacji. (opis tego jak takie uprawnienie ustawi─ç przy pomocy interfejsu ePUAP znajduje si─Ö w punkcie 5.2.)

Us┼éuga decisionQuery jest w przypadku ePUAP o tyle nietypowa ┼╝e wymaga aby w sekcji "body" koperty "SOAP" umie┼Ťci─ç tre┼Ť─ç zgodn─ů ze specyfikacj─ů protoko┼éu SAML podczas gdy reszta us┼éug z kt├│rymi w ePUAP mia┼éem do czynienia wymaga jednak du┼╝o prostrzych struktur (na szcz─Ö┼Ťcie OASIS si─Ö tym nie zajmowa┼é).

	/**
	 * 
	 * zwraca informacj─Ö o tym czy dane uprawnienie jest dozwolone czy zabronione
	 * @param string $urlEngineSAMLDecision adres url usługi
	 * @param string $rightName nazwa uprawnienia na ePuap
	 * @param string $nameID nazwa u┼╝ytkownika (login z ePUAP
	 * @param string $pubKey klucz publiczny
	 * @param string $privKey klucz prywatny
	 * @param unknown_type $msg zmienna na komunikat błędu
	 * @author Extern
	 * @return false lub true
	 */
	function getDecisionQuery($urlEngineSAMLDecision,$rightName,$nameID,$pubKey,$privKey,&$msg)
	{		
		$authzDecisionQuery="<samlp:AuthzDecisionQuery ID=\"".getUniqueID(20)."\" "
							."IssueInstant=\"".getTimestamp()."\" "
							."Resource=\"".$CI->config->item('appID')."\" Version=\"2.0\" "
							."xmlns:samlp=\"urn:oasis:names:tc:SAML:2.0:protocol\">"
							."<saml:Subject xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\">"
							."<saml:NameID>".$nameID."</saml:NameID>"
							."</saml:Subject>"
							."<saml:Action Namespace=\"hetman.epuap.gov.pl\" "
							."xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\">".$rightName."</saml:Action>"
							."<saml:Evidence xmlns:saml=\"urn:oasis:names:tc:SAML:2.0:assertion\">"
							."<saml:AssertionIDRef>"."_".$_COOKIE['TGSID']."</saml:AssertionIDRef>"
							."</saml:Evidence>"
							."</samlp:AuthzDecisionQuery>";
		
		$respond = callSecRequest($urlEngineSAMLDecision,'decisionQuery',$authzDecisionQuery,$pubKey,$privKey,$msg);
		if($respond)
			return  $respond['Assertion']['AuthzDecisionStatement']['!Decision'] == 'Permit';
		return false;		
	}

G┼é├│wne zadanie wygenerowania i podpisania koperty SOAP wykona dla nas opisana wy┼╝ej funkcja callSecRequest Jednak wcze┼Ťniej musimy przygotowa─ç dla niej to co ma si─Ö znale┼Ť─ç w sekcji body koperty SOAP. T─ů zawarto┼Ťci─ů jest dokument XML stworzony wed┼éug specyfikacji SAML typu <samlp:AuthzDecisionQuery> jako atrybut Resource musimy ustawi─ç identyfikator aplikacji do kt├│rej uprawnienie chcemy sprawdzi─ç (niestety mo┼╝emy si─Ö odpyta─ç tylko o jedno uprawnienie na raz). jako element <saml:NameID> ustawiamy identyfikator (login) uzytkownika o kt├│rego uprawnienia si─Ö odpytujemy (e tam i tak liczy si─Ö tylko TGSID). Jako element <saml:Action> musimy poda─ç nazw─Ö uprawnienia o kt├│re si─Ö odpytujemy powinna to by─ç ta sama nazwa kt├│rej ustawienie opisa┼éem w punkcie 5.2.. Kolejnym i w dodatku bardzo wa┼╝nym elementem do ustawienia jest <saml:AssertionIDRef> w kt├│rym musi si─Ö znales─ç warto┼Ť─ç identyfikatora TGSID kt├│rego pozyskanie jest opisane w pierwszym artykule z tej serii http://www.extern.pl/artykuly/sso_epuap/. Wa┼╝n─ů zauwa┼╝enia w tym przypadku jest fakt ┼╝e tym razem identyfikator musi by─ç poprzedzony znakiem podkre┼Ťlenie "_", kt├│ry to znak wcze┼Ťniej wed┼éug zalece┼ä pomocy technicznej dla integrator├│w zalecano mi usun─ů─ç przed utworzeniem ciastka z zawarto┼Ťci─ů TGSID. Stara┼éem si─Ö nie wnika─ç za bardzo w pokr─Ötn─ů logik─Ö jak─ů kierowali si─Ö autorzy ePUAPu odno┼Ťnie tego prefixu przed TGSIDem tylko zachowa┼éem si─Ö jak typowy konformista akceptuj─ůcy i dostosowuj─ůcy si─Ö do rzeczywisto┼Ťci na kt├│r─ů nie ma wp┼éywu i po prostu je┼Ťli wcze┼Ťniej przed zapisaniem ciestka TGSID wycio┼éem z pierwszej pozycji znak podkre┼Ťlenia to teraz po prostu go doklejam i tyle. A mo┼╝e po prostu nie nale┼╝a┼éo go wcze┼Ťniej usuwa─ç, nie wa┼╝ne nie chcia┼éo mi si─Ö ju┼╝ zmienia─ç kodu kt├│ry dzia┼éa┼é.

Po wywo┼éaniu funkcji callSecRequest dostaniemy jak─ů┼Ť odpowiedz od ePUAPu i w┼éa┼Ťciwie interesuje nas w tym wypadku tylko to czy w zwr├│conej tablicy w kluczu ['Assertion']['AuthzDecisionStatement']['!Decision'] znajduje si─Ö warto┼Ť─ç "Permit", je┼Ťli tak to znaczy ┼╝e u┼╝ytkownik z sesji opisywanej przez TGSID ma to uprawnienie o kt├│re si─Ö pytali┼Ťmy.

8. Odpytanie ePUAP o dane zalogowanego użytkownika czyli wywołanie uslugi getUserInfo

Kolejn─ů us┼éug─ů kt├│r─ů przedstawie jest mo┼╝liwo┼Ť─ç odpytania portalu ePUAP o dane zalogowanego u┼╝ytkownika. W odr├│┼╝nieniu od metody decisionQuery metoda getUserInfo wymaga du┼╝o prostrzej struktury s┼éu┼╝─ůcej do wywo┼éania us┼éugi ni┼╝ poprzednia metoda. Poniewa┼╝ w tym wypadku projektanci ePUAP nie musieli trzyma─ç si─Ö ┼╝adnych standard├│w i wymy┼Ťli w┼éasny format wywo┼éania. Format wywo┼éania metody getUserInfo opisany jest przez dokument WSDL znajduj─ůcy si─Ö pod adresem https://hetmantest.epuap.gov.pl/axis2/services/AuthorizationWS?wsdl i cho─ç jak z dokumentu WSDL wynika styl dokumentu jaki ma by─ç wstawiony do elementu "soap:body" jest typu "document" to po przyjrzeniu si─Ö dok┼éadniej temu czego oczekuje metoda webService wynika ┼╝e dokument xml przekazany jako parametr do z┼éudzenia przypomina wywo┼éanie znane ze stylu "rpc" i opisane jest przez sekcj─Ö

<xs:element name="getUserInfo">
	<xs:complexType>
		<xs:sequence>
			<xs:element minOccurs="0" name="tgsId" nillable="true" type="xs:string"/>
			<xs:element minOccurs="0" name="appId" nillable="true" type="xs:string"/>
		</xs:sequence>
	</xs:complexType>
</xs:element>

Oczywi┼Ťcie to nic z┼éego w tym ┼╝e tw├│rcy ePUAP u┼╝yli takiej metodologi powiem wi─Öcej ┼╝e w mojej opini to nawet bardzo dobrze, jest porz─ůdek i wszystko jest cacy a je┼Ťli by w przysz┼éo┼Ťci chcieli u┼╝y─ç stylu "rpc" to maj─ů wszystko gotowe.

A o to wywo┼é─ůnie us┼éugi getuserinfo na serwerze

	/**
	 * 
	 * medota zwraca dane o u┼╝ytkowniku
	 * @param string $urlAuthorizationWS adres url usługi
	 * @param string $appID identyfikator aplikacji w ePUAP
	 * @param unknown_type $msg zmienna na komunikat błędu
	 * @author Extern
	 * @return string ze struktur─ů xml zawierajac─ů dane u┼╝ytkownika lub false w przypadku pora┼╝ki
	 */
	function getUserInfo($urlAuthorizationWS,$appID,&$msg)
	{
		if(isset($_COOKIE['TGSID']))
		{
			$getUserInfoRequest = "<ns:getUserInfo xmlns:ns=\"http://ejb.draco.comarch.com\">"
							."<ns:tgsId>".$_COOKIE['TGSID']."</ns:tgsId>"
							."<ns:appId>".$appID."</ns:appId>"
							."</ns:getUserInfo>";							
			$respond = callSecRequest($urlAuthorizationWS,'getUserInfo',$getUserInfoRequest,$msg);			
			return $respond;							
		}
		return false;		
	}

Jak wida─ç powy┼╝ej znowu wykorzystujemy uniwersalno┼Ť─ç funkcji callSecRequest kt├│ra zapewni nam podpisanie koperty SOAP przez ws-security. W┼éa┼Ťciwie ca┼éa innowacyjno┼Ť─ç tego kodu w stosunku do wcze┼Ťniejszego przyk┼éadu dotyczy tylko trzeciego parametru czyli tego co co zostanie wstawione do sekcji "soap:body" koperty SOAP. Jak wida─ç w tym wypadku zawarto┼Ť─ç jest sporo prostrza i sk┼éada si─Ö jakby (bo jest to tak na prawd─Ö jeden parametr) z dw├│ch parametr├│w "tgsId" przeznaczonego na identyfikator sesji TGSID, natomiast drugim parametrem (elementem w dokumencie XML) jest "appId" czyli identyfikator aplikacji kt├│ry zapisali┼Ťmy konfiguruj─ůc aplikacj─Ö w konsoli DRACO.

Je┼Ťli wszystko jest poprawnie ePUAP zwr├│ci nam dokument xml zawieraj─ůcy informacje o u┼╝ytkowniku, takie jak imie, nazwisko, identyfikator (login), identyfikator podmiotu do jakiego przypisany jest u┼╝ytkownik, oraz adres email. Niestety metoda ta nie zwr├│ci nam identyfikatora PESEL zalogowanego u┼╝ytkownika, kt├│ry m├│g┼éby by─ç dla nas bardzo przydatny. Dzieje si─Ö tak poniewa┼╝ identyfikator PESEL jest dan─ů osobow─ů (data urodzenia, p┼ée─ç) dlatego ePUAP nie chce ryzykowa─ç i nie zwraca nam tego bardzo przydatnego identyfikatora. Niestety ten drobny szczeg├│┼é dosy─ç znacznie ogranicza mo┼╝liwo┼Ť─ç powa┼╝nego zastosowania tego ca┼éego ePUAPowego rozwi─ůzania, poniewa┼╝ bez jednoznacznego identyfikatora jakakolwiek pr├│ba powi─ůzania zalogowanego u┼╝ytkownika z danymi o u┼╝ytkowniku kr├│re mo┼╝emy mie─ç w naszych bazach jest skazana na wielk─ů niepewno┼Ť─ç bo przyk┼éadowo Adam├│w Kowalskich prawdopodobnie jest w Polsce bardzo wielu.

Pr├│bowa┼éem nawet dyskutowa─ç na ten temat z ludzmi z pomocy technicznej ePUAPu argumentuj─ůc ┼╝e jest to bez sensu bo przecie┼╝ u┼╝ytkownik loguj─ůcy si─Ö do naszej aplikacji przy pomocy ePUAPu tak na prawd─Ö loguje si─Ö sam do swojego konta wi─Öc dlaczego sam nie mo┼╝e pobra─ç dla siebie swojego identyfikatora PESEL. Jednak ePUAPowcy nie dali si─Ö przekona─ç argumentuj─ůc ┼╝e nie bo nie. Jak si─Ö nad tym g┼é─Öbiej zastanowi─ç to rzeczywi┼Ťcie istnieje pewne ryzyko zwi─ůzane z tym ┼╝e jaki┼Ť nie uczciwy lub nadgorliwy tw├│rca jakiego┼Ť systemu zewn─Ötrznego w stosunku do ePUAPU m├│g┼éby zbiera─ç PESELe loguj─ůcych si─Ö przy pomocy jego aplikacji do ePUAPu os├│b. Zarz─ůdzaj─ůcy portalem ePUAP nie chc─ů ponosi─ç tego ryzyka wi─Öc profilaktycznie nie daj─ů tej mo┼╝liwo┼Ťci i kropka.

Us┼éuga getUserInfo jest przyk┼éadem dosy─ç popularnego sposobu wywo┼éywania wi─Ökszo┼Ťci us┼éug na portalu ePUAP, jednak oczywi┼Ťcie r├│┼╝ne us┼éugi maj─ů zar├│wno r├│┼╝ne adresu URL pod kt├│rymi si─Ö znajduj─ů jak i r├│┼╝ne parametry wywo┼éania kt├│rych wymagaj─ů. Tak wi─Öc niestety od analizy dokument├│w WSDL nie uciekniemy. Opis us┼éug, ich adres├│w URL znajduje si─Ö na portalu ePUAP pod adresem Pomoc-Integratorzy-Specyfikacja WSDL

8. Za┼é─ůczniki

Kody źródłowe

9. Materiały



Dodaj komentarz:
Tak
Nie

Autor:purofuego
Data: 2017-10-06 19:49
Tre┼Ť─ç:Podmiot, kt├│ry zamierza wykorzystywa─ç us┼éugi dost─Öpne w Profilu Zaufanym, powinien posiada─ç uprawnienia podmiotu publicznego. http://mc.bip.gov.pl/departament-utrzymania-i-rozwoju-systemow/integracja-systemow-z-profilem-zaufanym.html

Autor:cedo
Data: 2017-10-06 9:27
Tre┼Ť─ç:Chcia┼ébym wiedzie─ç czy funkcjonalno┼Ť─ç podpisywania dokument├│w XML (pytam w kontek┼Ťcie plik├│w JPK) jest mo┼╝liwa dla wszystkich (ka┼╝dej firmy w Polsce) czy tylko dla urz─Öd├│w ? Gdzie znajd─Ö wskaz├│wk─Ö na ten temat ?

Autor:Maciek
Data: 2017-07-06 13:03
Tre┼Ť─ç:Witam, staram si─Ö zintegrowa─ç z now─ů testow─ů platforma int.epuap.gov.pl i int.pz.gov.pl, uda┼éo mi si─Ö ju┼╝ wyd─Öbi─ç od obs┼éugi ePUAP certyfikat, do WS-security kt├│rym my podpisujemy ┼╝─ůdania, niestety nie mog─Ö wyci─ůgn─ů─ç certyfikat├│w do truststore. Na platformie produkcyjnej s─ů w dziale POMOC, niestety ne testowym ich nie ma. Kto┼Ť mo┼╝e wie gdzie to mo┼╝na dosta─ç?

Autor:maciek
Data: 2016-09-06 14:04
Tre┼Ť─ç:Zmiany w stosunku do powy┼╝szego artyku┼éu w zwi─ůzku z wdro┼╝eniem wydzielonego PZ (wrzesie┼ä 2016) - http://cu-devel.warmia.mazury.pl/wydzielonyPZ.txt

Autor:Damian Bar
Data: 2016-06-22 14:49
Tre┼Ť─ç:W razie pyta┼ä prosz─Ö o kontakt www.smart-net.eu

Autor:Damian Bar
Data: 2016-06-22 14:48
Tre┼Ť─ç:Witam Hm przyznam si─Ö ┼╝e dopiero teraz znalaz┼éem t─ů stron─Ö i sam przerabia┼éem integracj─Ö Ale do generowania podpisanej koperty SOAP proponuje o wiele leps┼╝a metod─Ö i do tego ┼éadnie obs┼éuguj─ůc─ů wyj─ůtki Chodzi o wykorzystanie ws-php z code.google mo┼╝na ┼Ťlicznie rozszerzy─ç klas─Ö SoapClient. Przetestowane na ok 100 urzedach, dzia┼éa

Autor:gosc
Data: 2016-02-05 7:04
Tre┼Ť─ç:Czy mo┼╝emy zleci─ç Panu wy┼╝ej opisan─ů integracj─Ö?

Autor:HumbleHunt
Data: 2016-02-03 11:06
Tre┼Ť─ç:Mam pytanie, czy podczas walki z integracj─ů kto┼Ť z was spotka┼é si─Ö z problemem: No privilleges to ask about application Po┼é─ůczenie z webserwisem jako tako mam, natomiast dalej mnie nie przepuszcza. (Pr├│ba wywo┼éania getUserInfo) Pozdrawiam :)

Autor:Fred
Data: 2015-01-13 18:20
Tre┼Ť─ç:Mo┼╝e kto┼Ť spotka┼é si─Ö z b┼é─Ödem: soapenv:Server WSDoAllReceiver: security processing failed

Autor:Extern
Data: 2014-10-22 11:55
Tre┼Ť─ç:W┼éa┼Ťciwie ca┼é─ů wiedz─Ö jak─ů mia┼éem na ten temat (poza podpisywaniem dokumentu profilem zaufanym, o czym poradnik nie powsta┼é) przekaza┼éem w tych artyku┼éach pisanych na gor─ůco. Po tych kilku ju┼╝ latach jakie min─Ö┼éy od czasu gdy dotyka┼éem EPUAPu w g┼éowie zosta┼éo mi na ten temat mniej ni┼╝ zosta┼éo opisane powy┼╝ej.

Autor:igor
Data: 2014-09-10 19:46
Tre┼Ť─ç:a jak mo┼╝na si─Ö skontaktowac w celu zadania :-) d┼éu┼╝szego pytania ....

Autor:Wojtek
Data: 2014-04-14 14:53
Tre┼Ť─ç:Super, zaoszcz─Ödzi┼ée┼Ť mi mn├│stwo czasu. ┼Üwietny artyku┼é

Autor:Marek
Data: 2014-03-05 16:19
Tre┼Ť─ç:┼Üwietny artyku┼é, bardzo mi pom├│g┼é. Mam jedno pytanie - bo nie mog┼éem znale┼║─ç tego w dokumentacji, czy jest jaki┼Ť zdalny interface (web service) do wylogowania u┼╝ytkownika o danym TGSID?

Autor:Jacek
Data: 2014-02-25 12:57
Tre┼Ť─ç:U mnie natomiast wyst─ůpi┼é problem, ┼╝e SignatureValue odpowiedzi z epuapu by┼éa niepoprawna (ale w fiddlerze odpowiedz zawiera┼éa te rekordy kt├│re chcia┼éem). Kto┼Ť mia┼é podobny problem?

Autor:Autor
Data: 2013-11-18 15:05
Tre┼Ť─ç:Mia┼é kto┼Ť z was ten problem ? po podpisaniu certyfikatem, przy pr├│bie wysy┼éki WSEC5621E: Unsupported signed part: URI=

Autor:Magda
Data: 2013-10-24 14:37
Tre┼Ť─ç:Artyku┼é MEGA pomocny! dzi─Öki! Spotka┼é si─Ö kto┼Ť mo┼╝e z problemem " Allowed memory size of 134217728 bytes exhausted"? Nie wiem czy to problem z kodem czy ograniczeniem serwera?

Autor:Magda
Data: 2013-10-24 14:18
Tre┼Ť─ç:Artyku┼é MEGA pomocny! dzi─Öki! Spotka┼é si─Ö kto┼Ť mo┼╝e z problemem " Allowed memory size of 134217728 bytes exhausted"? Nie wiem czy to problem z kodem czy ograniczeniem serwera?

Autor:Magda
Data: 2013-10-24 11:17
Tre┼Ť─ç:na certyfikat testowy czeka┼éam ok 2 dni, ale na uprawnienia administratora tydzie┼ä.

Autor:Autor
Data: 2013-10-22 12:47
Tre┼Ť─ç:Jak d┼éugo czeka┼ée┼Ť na wydanie certyfikatu ?

Autor:Aaimnr
Data: 2012-10-15 11:12
Tre┼Ť─ç:Je┼╝eli chodzi o brak mo┼╝liwo┼Ťci weryfikacji pesel, to czy nie jest tak, ┼╝e cho─ç nie mo┼╝emy odpyta─ç o pesel, to mo┼╝emy uzyska─ç odpowied┼║, czy podany przez nas pesel, jest poprawnym peselem ( PeselProxy.wsdl )? Funkcjonalno┼Ť─ç jest r├│wnowa┼╝na (mo┼╝emy poprosi─ç u┼╝ytkownika o podanie pesel je┼╝eli jeszcze go nie mamy), a wyklucza uzyskanie danych osobowych bez zgody u┼╝ytkownika.

Autor:Kamil
Data: 2012-08-20 13:09
Tre┼Ť─ç:Mo┼╝e kto┼Ť zna odpowied┼║: http://stackoverflow.com/questions/12035980/webservice-client-and-signing-messages

Autor:Kamil
Data: 2012-08-20 13:08
Tre┼Ť─ç:Mo┼╝e kto┼Ť zna odpowied┼║: http://stackoverflow.com/questions/12035980/webservice-client-and-signing-messages

Autor:kravietz
Data: 2012-04-20 10:41
Tre┼Ť─ç:Naprawd─Ö ┼Ťwietny kawa┼éek!

Autor:Miodzio po
Data: 2012-03-31 15:50
Tre┼Ť─ç:Dzi─Öki wielkie za ten obszerny artyku┼é. Bardzo pomocna sprawa, super robota!

Autor:Sebastian
Data: 2011-09-09 10:33
Tre┼Ť─ç:Ten poradnik powinien by─ç udost─Öpniany w dokumentacji epuapu

Autor:Extern
Data: 2011-09-07 20:39
Tre┼Ť─ç:Mi┼éo mi widzie─ç ┼╝e si─Ö wiedza przydaje, artyku┼é na dzisiejsz─ů chwil─Ö jest jeszcze nie sko┼äczony, nie opisa┼éem jeszcze podpisywania dokumentu XML profilem zaufanym, ale niestety ci─ůg┼éy brak czasu.

Autor:Sebastian
Data: 2011-09-06 12:17
Tre┼Ť─ç:Witam, pracuj─Ö nad projektem, kt├│rego jednym z element├│w jest podpisywanie dokument├│w za pomoc─ů profilu zaufanego. Ch─Ötnie postawi┼ébym jaki┼Ť dobry trunek autorowi za przebrni─Öcie przez to wszystko i umieszczenie poradnika w sieci. Nie ma tylko nigdzie numeru konta

Autor:Jacek
Data:2011-09-06 11:13
Tre┼Ť─ç:Dzi─Öki za kolejn─ů dawk─Ö po┼╝ytecznych informacji :)

Copyright Extern