AdminGuide:RestAPI
Return to AdminGuide
General description
KalliopePBX offers a set of REST APIs that can be invoked by external systems to execute device (e.g. extension creation, backup generation and download, etc.) or consultation actions (e.g. CDR download, etc.).
APIs can be accessed through HTTP or HTTPS with authentication, following the mechanism described below.
Authentication mechanism
The REST API authentication mechanism uses the same user credentials as those needed to access the web. Specifically, each request must contain a custom single-use HTTP header named X-authenticate. The authentication procedure is one-way, i.e. it does not require the server to send a challenge, and all information necessary for authentication is generated from the client side.
Because the headers are single use, knowledge of the X-authenticate header of a request does not allow one to send an illicit request, thus preventing replication attacks.
X-authenticate header construction
L'header è composto da una serie di dati in chiaro ed un digest costruito utilizzando tali dati, unitamente alla password dell'utente che effettua la richiesta. Di seguito un esempio di un X-authenticate header completo:
X-authenticate: RestApiUsernameToken Username=”admin”, Domain=”default”, Digest=”+PJg7Tb3v98XnL6iJVv+v5hwhYjdzQ2tIWxvJB2cE40=”, Nonce=”bfb79078ff44c35714af28b7412a702b”, Created=”2016-04-29T15:48:26Z”
I dati che sono utilizzati (e trasmessi nella richiesta) nella costruzione dell'header sono:
- Username: lo username dell'utente (es. admin)
- Domain: il dominio del tenant di appartenza dell'utente. Nel caso di sistemi mono-tenant, il dominio predefinito è "default"
- Nonce: una stringa casuale esadecimale generata dal client , di lunghezza almeno pari a 8 caratteri. Ad ogni richiesta è necessario rigenerare un nuovo nonce, in quanto il sistema tiene traccia di tutti quelli utilizzati in precedenza, per un periodo pari al tempo di validità del nonce, che è pari a 5 minuti. Dopo 5 minuti è possibile riutilizzare un nonce utilizzato in precedenza; la protezione da attacchi basati su replica è in questo caso garantita dal timestamp di creazione del nonce
- Created: indica il timestamp di creazione del nonce; se l'ora di ricezione della richiesta differisce dall'ora impostata sul KalliopePBX per più di 5 minuti, la richiesta viene considerata invalida e rifiutata. Questo garantisce che il riuso di un X-authenticate header con lo stesso nonce non sia possibile né entro i 5 minuti del tempo di vita di un nonce (per la protezione da replica implementata) né oltre tale tempo di vita. Il formato della stringa del timestamp (riportato al timezone UTC) è "YYYY-MM-DDThh:mm:ssZ".
Il campo Digest è un hash dei dati sopra descritti e della password dell'utente, e si calcola applicando la funzione di hash sha256 alla concatenazione delle stringhe Nonce, digestPassword, Username, Domain e Created (concatenazione delle stringhe senza delimitatori):
Digest = sha256(Nonce + digestPassword + Username + Domain + Created)
Dato che sul KalliopePBX le password utente non sono salvate in chiaro ma sotto forma di hash non reversibile, per la generazione del Digest è necessario utilizzare l'hash della password con la stessa procedura utilizzata nel PBX (indicata come digestPassword) e non la password in chiaro.
La procedura di calcolo della digestPassword richiede, oltre alla password dell'utente, una ulteriore stringa denominata salt, univoca per tenant. Il salt può essere ottenuto dal KalliopePBX mediante una API REST apposita, invocabile in modo anonimo (senza autenticazione).
La formula di calcolo della digestPassword è (i caratteri { e } fanno parte della stringa di cui si esegue lo sha256 e devono essere inseriti):
digestPassword = sha256(password{<salt>})
Ad esempio, supponendo che la password dell'utente sia "admin" e il salt sia uguale a "b5a8fdcf2f8d5acdad33c4a072a97d7a", la digestPassword risultante è:
digestPassword = sha256(admin{b5a8fdcf2f8d5acdad33c4a072a97d7a}) = dd7b0be7fa37d6cbaf0b842bf7532f229cb79ab8d54d509c2aa7eea27a53cd5e
Come esempio, con i dati seguenti:
Nonce: bfb79078ff44c35714af28b7412a702b digestPassword: dd7b0be7fa37d6cbaf0b842bf7532f229cb79ab8d54d509c2aa7eea27a53cd5e Username: admin Domain: default Created: 2016-04-29T15:48:26Z
si ottiene:
Digest = base64(sha256binary(bfb79078ff44c35714af28b7412a702bdd7b0be7fa37d6cbaf0b842bf7532f229cb79ab8d54d509c2aa7eea27a53cd5eadmindefault2016-04-29T15:48:26Z))
che vale +PJg7Tb3v98XnL6iJVv+v5hwhYjdzQ2tIWxvJB2cE40=.
NOTA: la funzione sha256binary(..) indica la funzione sha256(..) che restituisce l'output in formato binario e non in formato esadecimale.
La stringa completa risultante da inserire all'interno dell'header X-authenticate è quindi quella indicata all'inizio del paragrafo e riportata di seguito:
X-authenticate: RestApiUsernameToken Username=”admin”, Domain=”default”, Digest=”+PJg7Tb3v98XnL6iJVv+v5hwhYjdzQ2tIWxvJB2cE40=”, Nonce=”bfb79078ff44c35714af28b7412a702b”, Created=”2016-04-29T15:48:26Z”
Elenco API
La lista dettagliata e aggiornata delle API è consultabile tramite l'interfaccia web di KalliopePBX all'indirizzo http://KALLIOPE_IP_ADDRESS/api/doc