Referință API
Reguli de tratare a erorilor¶
Pentru erorile rezultate în urma apelurilor interfeței REST, MLog returnează erori HTTP (fault) cu coduri de eroare și motive care descriu eroarea în limbaj simplu.
Pentru clienții care utilizează limbaje de programare ce suportă blocuri try… catch, tratarea erorilor HTTP este modalitatea corectă de gestionare a erorilor de invocare a serviciului.
| Cod de eroare | Descriere |
|---|---|
| 400 Bad Request | Cererea de intrare nu este un JSON valid Orice altă eroare care nu poate fi ocolită – vă rugăm să rețineți că se oferă o explicație detaliată în răspuns. |
| 401 Unauthorized | Se declanșează dacă evenimentul de intrare nu poate fi identificat ca aparținând vreunui SI |
| 404 Not Found | URL-ul accesat nu este disponibil în acest moment (404). Nu au fost găsite date pentru parametrii furnizați. |
| 413 Payload Too Large | Informații despre limita maximă admisă a dimensiunii unui mesaj. Limita curentă pentru dimensiunea totală a mesajului este de 256 KB. |
| 500 Internal Server Error | Eroare declanșată de o funcționare defectuoasă a sistemului MLog. Vă rugăm să contactați administratorii MLog în cazul în care primiți o astfel de eroare |
Câmpuri predefinite ale evenimentului¶
Tabelul de mai jos listează câmpurile predefinite ale evenimentului:
| Denumire câmp | Tip/Lungime | Obligatoriu | Descriere |
|---|---|---|---|
| event_time | datetime | Da | Momentul în care evenimentul s-a produs la sistemul sursă (nu momentul jurnalizării). |
| event_type | string | Da | Tipul evenimentului conform definiției SI, care de regulă reprezintă acțiunea întreprinsă care a generat acest eveniment (ex. Created, Authenticated, Deleted etc.). Se recomandă următorul tipar: System.X.Y Exemplu: MPass.User.Authenticated MLog definește un subset de tipuri comune tuturor SI, care au scopul de a identifica evenimente speciale. Aceste evenimente fac obiectul unei procesări speciale (filtrare) prin înregistrarea lor în indici specifici, ulterior accesibili altor instituții/sisteme. |
| event_id | string | Nu | Identificatorul intern al evenimentului (de regulă unic) sau un alt tip de identificator intern de corelare (precum ID-ul tranzacției, cererii etc.), unic pentru sistemul care jurnalizează. |
| event_correlation | string | Nu | Un identificator utilizat pentru corelarea evenimentelor jurnalizate de sisteme diferite într-un anumit context, de regulă o acțiune a utilizatorului. |
| event_level | string | Nu | Clasificator al evenimentului. Fiecare SI care înregistrează evenimente în MLog poate utiliza propria definiție pentru acest câmp, de exemplu relevanța (ex. high/medium/low) sau impactul (warning/critical/fatal) etc. |
| event_source | string | Nu | Locul în care a fost generat evenimentul. Ex: denumirea clasei de logging, subcomponenta SI sau numele serverului etc. |
| event_message | string | Nu | Text liber care descrie evenimentul, indexat de MLog pentru căutare avansată de text. |
| event_details | string | Nu | Detalii ale evenimentului, precum un stack trace al unei excepții, un extras de document sau altele. Nu este indexat. |
| legal_entity | string | Nu | Entitatea juridică (organizația) în numele căreia a fost efectuată acțiunea (de către un utilizator sau automat). De regulă este IDNO-ul organizației. |
| legal_basis | string | Nu | Temeiul legal pentru acțiunea întreprinsă. |
| legal_reason | string | Nu | Motivul pentru care a fost creat acest eveniment (ex. numărul cererii, numărul de telefon apelat etc.). |
| user | string | Nu | Utilizatorul care este proprietarul evenimentului (a participat la crearea acestuia). De regulă este IDNP-ul utilizatorului. |
| user_session | string | Nu | Sesiunea utilizatorului în al cărei context s-a produs acțiunea. Acest atribut permite separarea acțiunii întreprinse de un utilizator, dacă acțiunea reprezintă un pas dintr-un flux. |
| user_address | string | Nu | Adresa IP a utilizatorului, locația sau orice altă formă care identifică de unde a acționat utilizatorul. |
| subject | string | Nu | Identificatorul lucrului sau persoanei care este afectată, discutată sau vizată de acest eveniment (de regulă un IDNP). Diferă de obiect, deoarece obiectul este direct implicat în acțiune. |
| subject_type | string | Nu | Tipul subiectului. |
| subject_name | string | Nu | Numele subiectului. |
| object | string | Nu | Identificatorul lucrului sau persoanei către care este direcționată acțiunea evenimentului. |
| object_type | string | Nu | Tipul obiectului. |
| object_name | string | Nu | Numele obiectului. |
Câmpul event_time acceptă formatele descrise de următoarea sintaxă (parantezele pătrate indică o parte opțională):
YYYY-MM-dd[THH:mm:ss[.SSS][Z|±HH[mm]]]
unde yyyy – anul, MM – luna (01-12), dd – ziua (01-31), HH – ora (00-23), mm – minutele (00-59), ss – secundele (00-59), SSS – milisecundele (000-999), ±HH[mm] – specificarea opțională a fusului orar (cu minute opționale).
Există doar 2 câmpuri obligatorii pentru înregistrarea unui mesaj: event_time și event_type. Celelalte câmpuri sunt opționale și pot să nu fie incluse în evenimentul de intrare. Mai mult, orice câmp poate avea mai multe valori, caz în care acestea trebuie jurnalizate ca array-uri JSON.
Este de asemenea posibilă utilizarea oricărei alte denumiri de câmp. În acest caz, câmpul va fi înregistrat ca tip string. Rețineți că denumirile care încep cu „_” (underline) sau „@” (at) sunt rezervate.
Important: Toate șirurile de caractere au o lungime maximă de 32766 bytes (32KB – 2 bytes). Rețineți că limita este exprimată în bytes, nu în caractere, ceea ce înseamnă că, dacă jurnalizați un șir UTF-8, limita reală este de 8191 caractere în cel mai defavorabil scenariu. Dacă aveți nevoie să stocați mai mult într-un câmp, solicitați o schemă specială de la administratorul MLog pentru a vi se configura un câmp neindexat.
Observație: este posibilă jurnalizarea obiectelor imbricate în evenimente. Acestea sunt convertite în obiecte complexe și pot fi interogate ulterior după denumirea câmpurilor lor. Totuși, această opțiune trebuie testată în mediul de staging înainte de a fi utilizată în producție, din cauza oricărui efect secundar pe care îl poate genera. În cazul în care câmpul personalizat stochează un obiect JSON, dar este necesar să fie salvat ca STRING în baza de date backend, acest lucru trebuie convenit cu administratorii MLog pentru o schemă specială.
Evenimente speciale¶
MLog definește un subset de tipuri de evenimente comune tuturor SI, al căror scop este identificarea evenimentelor speciale. Aceste evenimente fac obiectul unei procesări speciale prin înregistrarea unei proiecții a câmpurilor evenimentului în indici speciali, ulterior accesibili altor instituții/sisteme.
MLog identifică evenimentele speciale de regulă prin analizarea câmpului event_type.
În prezent este definit un singur tip special de evenimente, și anume evenimentele legate de accesul la date cu caracter personal. Când câmpul event_type conține „PersonalData”, MLog va considera acest eveniment ca fiind de acest tip. Prin convenție, trebuie utilizat următorul format pentru acest câmp:
PrefixulSistemuluiDvs.PersonalData.Actiune
unde se recomandă următoarele valori pentru Acțiune:
| Acțiune | Descriere |
|---|---|
| Access | Accesul electronic la date cu caracter personal. |
| Export | Exportul sau tipărirea datelor cu caracter personal, nu doar accesul. |
| Validate | Validarea datelor cu caracter personal, adică cererea conține date cu caracter personal, iar răspunsul doar confirmă corectitudinea datelor. |
| Search | Căutare inexactă a datelor cu caracter personal, ceea ce înseamnă că rezultatul poate conține informații despre mai multe persoane sau entități. |
| Transfer | Transferul sau sincronizarea datelor cu caracter personal, adică datele cu caracter personal sunt transferate către un alt sistem pentru procesare ulterioară. |
Tabelul de mai jos listează câmpurile evenimentului care fac parte din evenimentele speciale:
| Denumire câmp | Predefinit | PersonalData | Note |
|---|---|---|---|
| event_time | Da | Da | |
| event_type | Da | Da | A se vedea descrierea formatului de mai sus. |
| event_correlation | Da | Da | |
| legal_entity | Da | Da | Entitatea juridică care accesează datele cu caracter personal. |
| legal_basis | Da | Da | Temeiul legal pentru accesul la datele cu caracter personal. |
| legal_reason | Da | Da | Motivul legal pentru accesul la datele cu caracter personal. |
| user | Da | Da | IDNP-ul utilizatorului care a accesat datele cu caracter personal. |
| user_address | Da | Da | Adresa utilizatorului (de regulă adresa IP). |
| subject | Da | Da | IDNP-ul subiectului datelor cu caracter personal. |
| subject_type | Da | Da | Tipul subiectului datelor cu caracter personal (de regulă Persoană). |
| subject_name | Da | Da | Numele subiectului datelor cu caracter personal. |
| object | Da | Da | Obiectul legat de subiectul datelor cu caracter personal care este accesat (precum numărul de înmatriculare a autovehiculului etc.) |
| object_type | Da | Da | Tipul obiectului accesat (de ex. CarNumber). |
Parametri permiși pentru operațiunile de căutare¶
Sistemul MLog poate accepta o listă de parametri ca date de intrare pentru operațiunea de căutare, după cum urmează:
Pentru căutarea după UID:¶
| Denumire câmp | Tip/Lungime | Obligatoriu | Descriere |
|---|---|---|---|
| legal_entity | string | Nu | Entitatea juridică care efectuează căutarea. Implicit, este setată la posesorul clientului MLog. |
| legal_basis | string | Nu | Temeiul legal pentru căutare. |
| legal_reason | string | Nu | Motivul legal pentru căutare. |
| user | string | Nu | IDNP-ul utilizatorului care caută evenimente. |
| user_address | string | Nu | Adresa utilizatorului (de regulă adresa IP). |
Pentru căutarea după interval de timp:¶
| Denumire câmp | Tip/Lungime | Obligatoriu | Descriere |
|---|---|---|---|
| legal_entity | string | Nu | Entitatea juridică care efectuează căutarea. Implicit, este setată la posesorul clientului MLog. |
| legal_basis | string | Da | Temeiul legal pentru căutare. |
| legal_reason | string | Nu | Motivul legal pentru căutare. |
| user | string | Nu | IDNP-ul utilizatorului care caută evenimente. |
| user_address | string | Nu | Adresa utilizatorului (de regulă adresa IP). |
| event_time_from | datetime | Da | Momentul de început al perioadei de căutare (inclusiv). |
| event_time_to | datetime | Da | Momentul de sfârșit al perioadei de căutare (exclusiv). |
| filter | listă separată prin virgulă | Nu | O listă de perechi cheie/valoare pentru câmpurile cunoscute de căutat. MLog va filtra doar evenimentele care corespund câmpurilor date. Formatul este field1=value1,field2=value2 etc. |
| page | număr (>=0) | Nu | Numărul paginii care urmează a fi returnată, în cazul în care există mai multe pagini de rezultate. Implicit, se consideră 0 (prima pagină). |
| page_size | număr (> 0) | Nu | Dimensiunea paginii aleasă. Implicit: 50. |
Câmpurile event_time_from și event_time_to acceptă același format ca și câmpul event_time înregistrat.
Numărul maxim de evenimente returnate este page * page_size <= 10 000.
Semnarea unui eveniment¶
Sistemul MLog utilizează protocolul JSON Object Signing and Encryption (JOSE/JWS, a se vedea [1] și [2]) pentru semnarea unui mesaj.
Mai jos este un exemplu în JAVA care semnează și verifică un mesaj JSON:
import java.io.FileInputStream;
import java.security.KeyStore;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import javax.security.cert.X509Certificate;
import com.nimbusds.jose.JWSAlgorithm;
import com.nimbusds.jose.JWSHeader;
import com.nimbusds.jose.JWSObject;
import com.nimbusds.jose.JWSSigner;
import com.nimbusds.jose.JWSVerifier;
import com.nimbusds.jose.Payload;
import com.nimbusds.jose.crypto.RSASSASigner;
import com.nimbusds.jose.crypto.RSASSAVerifier;
/**
* @author Constantin Stropsa constantin.stropsa@iello.ro
* @Aug 29, 2016
*
*/
public class JoseTest {
/**
* @param args
*/
@SuppressWarnings("restriction")
public static void main(final String[] args) throws Exception {
//JKS file must contain a private key with "me" name – or update the
//code to point to a valid private key
final KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("D:/TTS-2.3.4/bin/client.jks"),
"changeit".toCharArray());
final KeyStore.PrivateKeyEntry ppk = (KeyStore.PrivateKeyEntry)
ks.getEntry("me", new KeyStore.PasswordProtection("changeit".toCharArray()));
final RSAPrivateKey privateKey = (RSAPrivateKey) ppk.getPrivateKey();
final X509Certificate clientCertificate = new
com.sun.security.cert.internal.x509.X509V1CertImpl(ppk.getCertificate().getEncoded());
final JWSHeader.Builder header = new JWSHeader.Builder(JWSAlgorithm.RS256);
header.keyID(clientCertificate.getSerialNumber().toString(16));
System.out.println(header);
// Create JWS object with event data
JWSObject jwsObject = new JWSObject(header.build(), new Payload("{" +
" \"event_time\" : \"2016-09-15T19:05:56.095Z\"," +
" \"event_type\" : \"MLog.ClientQuery\"," +
" \"legal_basis\" : \"As part of a test\"," +
" \"legal_reason\" : \"As part of a test\"," +
" \"event_message\" : \"from=12345;to=43321;basis=As part of direct UID search;reason=UID search;filter=UID=1;page=0;page_size=70\"" +
"}"));
final RSAPublicKey publicKey = (RSAPublicKey) clientCertificate.getPublicKey();
// Create RSA-signer with the private key
final JWSSigner signer = new RSASSASigner(privateKey);
// Apply the HMAC to the JWS object
jwsObject.sign(signer);
// Output to URL-safe format
final String serialized = jwsObject.serialize();
System.out.println("SIGNED+SERIALIZED = " + serialized);
System.out.println("-------------------");
jwsObject = JWSObject.parse(serialized);
final JWSVerifier verifier = new RSASSAVerifier(publicKey);
System.out.println("Validate input = " + jwsObject.verify(verifier));
System.out.println("FINAL = " + jwsObject.getPayload().toString());
}
}
MLog utilizează modul compact al protocolului JOSE, afișat în formatul de mai jos. În Serializarea Compactă JWS, un JWS este reprezentat ca o concatenare:
BASE64URL(UTF8(JWS Protected Header)) || '.' ||
BASE64URL(JWS Payload) || '.' ||
BASE64URL(JWS Signature)
Pentru a activa semnarea JOSE într-un proiect, adăugați următoarele librării:
Maven:
http://mvnrepository.com/artifact/com.nimbusds/nimbus-jose-jwt/4.26
<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>nimbus-jose-jwt</artifactId>
<version>4.26</version><!-- or a newer version -->
</dependency>
Mod offline – descărcați și atașați următorul jar în proiect:
http://central.maven.org/maven2/com/nimbusds/nimbus-jose-jwt/4.26/nimbus-jose-jwt-4.26.jar