Model integracije
Pristup↵
API funkcijama se pristupa preko adrese http://gbs-stage.mfin.trezor.rs:2282. Svaki poziv ima prefiks api i opciono verziju u putanji vX.Y:
/api/login
Poziva poslednju verziju funkcije./api/v1.1/login
Poziva verziju 1.1 funkcije.
Zaglavlje rezultata svakog poziva sadrži atribut api-supported-versions koji lista sve raspoložive verzije funkcije. Poslednja verzija API-ja je dodatno označena sufiksom current, npr. 1.1-current.
Neaktuelne verzije API-ja zastarevaju (eng: deprecation) i biće uklonjene. Uklanjanje se neće vršiti ranije od 3 meseca od trenutka raspoloživosti nove verzije.
API koristi JSON format za razmenu podatka i osim ako je drugačije napomenuto, ContentType za svaki request je application/json.
Upozorenje
Postoji maksimalna frekvencija upotrebe svake konkretne funkcije SPIRI servisa (eng: Rate Limiter).
Na primer, neke funkcije je moguće koristiti maksimalno jednom u sekundi.
Model povratnog paketa↵
Sve API funkcije servisa SPIRI imaju standardizovanu formu povratnog paketa (payload). Povratni paket sadrži sledeći set polja:
- status - statusni kod i opis greške - u slučaju neuspelog poziva, inače
Success - payload - poslovni podaci konkretnog endpoint-a kao rezultat izvršenja funkcije
- additionalInformation - dodatni poslovni podaci, ukoliko je neophodno
Primer uspešnog povratnog paketa
{
"status": {
"message": "Success",
"code": "Success"
},
"payload": {
"creationTime": "2022-05-07T18:58:04.193788+02:00",
"accessToken": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9...",
"refreshToken": "eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9...",
"applicationStateId": 1
},
"additionalInformation": null
}
Primer povratnog paketa sa greškom
{
"status": {
"message": "Failed to generate access token with submitted credentials",
"code": "GenerateAccessToken"
},
"payload": null,
"additionalInformation": null
}
Autentikacija i autorizacija↵
Pristup zaštićenim pristupnim tačkama servisa zahteva autentikaciju. Pristup konkretnim funkcionalnostima zahteva odgovarajuća aplikativna prava (autorizaciju).
SPIRI koristi JWT standard za autentikaciju i autorizaciju.
Pristup se ostvaruje preuzimanjem access tokena (accessToken) pozivom /api/login javne pristupne tačke. Poziv zaštićenih pristupnih tačaka zahteva da u zaglavlju (eng: Headers) postoji Authorization atribut sa vrednošću Bearer <accessToken>.
Poruke o greškama koje se javljaju kod pristupa API funkcijama usled neodgovarajuće autentikacije ili autorizacije su:
| Code | Message | Opis |
|---|---|---|
401 |
Unauthorized |
Korisnik nije autentikovan |
403 |
Forbidden |
Korisnik nema odgovarajuće ovlašćenje za korišćenje funkcionalnosti |
Workflow autentikacije↵
Kako bi se krajnjem korisniku obezbedio nesmetan rad na servisu, kao i smanjio nepotreban broj poziva ka servisu, JWT pristup obezbeđuje mehanizam kontinualnog pristupa zaštićenim funkcijama upotrebom refresh workflow-a.
Inicijalnim pozivom pozivom /api/login javne pristupne tačke, sadržaj povratnog paketa uspešnog zahteva će sadržati polja:
- accessToken - pristupni token kratkoročne validnosti - 20 minuta,
- refreshToken - dugoročni token
Pristupni access token omogućava neposredno pozivanje zaštićenih funkcija u toku trajanja access sesije (20 minuta). Nakon isteka sesije, pozivi zaštićenih funkcija servisa sa istim access tokenom će rezultovati greškom 401 - Unauthorized.
Kako bi se izbegla potreba za ponovnim slanjem korisničkih kredencijala, postavljanjem Authorization atributa na vrednost Bearer <refreshToken> i pozivom refresh funkcije, omogućeno je pribavljanje novog aktivnog access tokena i time nastavljen neometan rad krajnjeg korisnika u trajanju nove access sesije.
Rezime workflow-a
- Pribavljanje access i refresh tokena pozivom login funkcije sa korisničkim kredencijalima,
- Rad sa zaštićenim funkcijama servisa upotrebom access tokena u trajanju kratkoročne sesije,
- Nakon isteka kratkoročne sesije, poziv zaštićene funkcije rezultuje greškom
401 - Unauthorized, - Pribavljanje validnog access tokena pozivom refresh funkcije upotrebom refresh tokena,
- Nastavak rada sa zaštićenim funkcijama servisa upotrebom novog validnog access tokena
SPIRI JWT token↵
Pored standardnih sigurnosnih elemenata, JWT token servisa SPIRI sadrži i određeni broj polja koja se odnose na poslovnu logiku samog servisa.
unique_name- jedinstveno korisničko ime u sistemloginuser_name- puno ime korisnika,user_id- identifikator korisnika,organization_id- identifikator organizacije korisnika,budget_user_id- JBKJS korisnika,budget_user_name- naziv budžetskog korisnika,budget_user_type- tip budžetskog korisnika,urgent_payment- da li korisnik može da kreira hitno plaćanje,treasury- šifra trezora,treasury_branch- šifra filijale trezora
Sekcija security_claims sadrži niz aplikativnih prava koja odgovaraju poslovnim funkcionalnostima servisa, a kojima korisnik ima omogućen pristup.
Nazivi aplikativnih prava se formiraju prema pravilu resurs_akcija, pri čemu resurs označava funkcionalnu celinu (aproprijacija, kvota, itd.), dok akcija predstavlja omogućenu radnju nad datim resursom (čitanje, izmena, odobravanje itd.)
Primer JWT tokena
{
"unique_name": "min_odbrane",
"user_name": "Korisnik ministarstva odbrane",
"user_id": "11",
"organization_id": "4",
"budget_user_id": "61040",
"treasury": "601",
"treasury_branch": "40200",
"budget_user_name": "MINISTARSTVO ODBRANE",
"budget_user_type": "1",
"urgent_payment": "True",
"security_claims": [
"user_notification_view",
"user_session_invoke",
"appropriation_request_view",
"appropriation_request_manage",
"appropriation_request_user_approve",
"appropriation_request_cancel",
"appropriation_view",
"appropriation_manage",
"quota_request_view",
"quota_request_manage",
"quota_view",
"recording_account_request_view",
"recording_account_request_manage",
"recording_account_view",
"datatable_view",
"document_type_view",
"budget_year_view",
"calendar_view",
"sub_economic_classification_view",
"sub_economic_classification_manage",
"economic_classification_payment_code_view",
"exchange_rate_view",
"enforced_collection_view",
"budget_structure_view"
],
"nbf": 1651950725,
"exp": 1651952525,
"iat": 1651950725,
"iss": "TreasurySecurityIssuer",
"aud": "TreasurySecurityAudience"
}