API Cloud per il controllo accessi

Versione: 1.05

IntegrazioniAPI

Questa pagina descrive come una società di integrazione (nel seguito Integration Company) usa l'API cloud di IpDoor per gestire i codici di accesso degli appartamenti. È il caso tipico dei gestionali per hotel, B&B e affitti brevi: quando nasce una prenotazione, il codice arriva ai dispositivi con le date e gli orari corretti.

Per la panoramica delle altre forme di integrazione vedi Integrazioni via API.

Prerequisiti#

Prima di scrivere codice servono tre cose.

  1. Credenziali API: IpDoor rilascia all'Integration Company un client_id e il relativo client_secret, che autorizzano l'accesso al portale cloud.
  2. Un account Integration Company creato su console.ipdoor.com: è l'account a cui verranno collegati tutti gli impianti che l'integratore potrà gestire.
  3. Un impianto configurato. L'impianto si crea dalla Console, tramite l'installatore, e non richiede che i dispositivi siano già installati: basta disporre dei codici identificativi (QR) dei dispositivi acquistati. Il wizard chiede un nome per il dominio (di norma corrisponde all'edificio) e poi per il dispositivo.

Due concetti da tenere presenti#

  • Un impianto (edificio) corrisponde a un dominio della piattaforma: la corrispondenza è uno a uno.
  • Un appartamento è rappresentato come utente virtuale: è a lui che vengono associati i codici di accesso.

Autenticazione#

L'accesso all'API richiede due token in sequenza: prima un token per l'account dell'Integration Company, poi un secondo token limitato all'impianto su cui si vuole operare. Entrambi viaggiano nell'header Authorization.

Ottenere il token#

L'API usa OAuth2 con token JWT. Il token si ottiene autenticandosi con le credenziali dell'account admin dell'Integration Company:

curl -X POST \
  -H 'Accept: application/json' \
  'https://<client_id>:<client_secret>@api.ipdoor.com/oauth/token' \
  -d 'grant_type=password&username=<email_admin>&password=<pass_admin>'

La risposta contiene il token da usare nelle chiamate successive:

{
  "access_token": "eyJhbG...",
  "token_type": "bearer",
  "refresh_token": "eyJhbG...",
  "scope": "read write",
  "type": "USER",
  "user_id": "<id_admin>",
  "username": "<email_admin>"
}

Il valore di access_token va passato in ogni chiamata nell'header Authorization, preceduto da Bearer:

curl -X GET \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer eyJhbG...' \
  'https://api.ipdoor.com/api/v2/users/me'

Il token ha una validità di 24 ore: scaduto, va rifatto il login (oppure usato il refresh_token). GET /api/v2/users/me è anche il modo più rapido per leggere l'id dell'utente admin, che serve in alcune chiamate.

Login nell'impianto#

Molte operazioni richiedono un token limitato a un impianto (scoped sul dominio). Si ottiene con:

curl -X POST \
  -H 'Accept: application/json' \
  -H 'Authorization: Bearer eyJhbG...' \
  'https://api.ipdoor.com/api/v2/auth/<id_impianto>'

La risposta ha la stessa forma del login iniziale, con in più il campo domain_id. Anche questo token si usa nell'header Authorization.

Elenco degli impianti e degli appartamenti#

Queste due chiamate servono a scoprire su cosa si può operare: quali impianti sono collegati all'account dell'integratore e quali appartamenti contiene ciascun impianto.

Impianti collegati all'account#

GET /api/v2/users/<id_admin>/domains

Restituisce l'elenco dei domini gestibili, ciascuno con id, name, label, status e connectionMode.

Appartamenti di un impianto#

Serve prima il login nell'impianto, poi:

GET /api/v2/users/virtual?ownerId=<id_owner>&domainId=<id_impianto>

<id_owner> è l'utente proprietario degli appartamenti: a seconda di come è stato configurato l'impianto può essere lo stesso account admin dell'Integration Company, oppure un altro utente dell'impianto (in quel caso l'id va richiesto a chi ha creato l'impianto).

Ogni appartamento restituito ha type: "VIRTUAL" e il proprio id, che identifica l'appartamento nelle chiamate sui codici.

Verificare che l'impianto sia raggiungibile#

Prima di creare un codice conviene controllare lo stato dell'impianto:

GET /api/v2/domains/<id_impianto>

Nel campo status si legge ONLINE se tutti i dispositivi dell'impianto sono online, OFFLINE se almeno uno non lo è.

Creare un codice PIN o QR#

Con il token dell'impianto:

POST /api/v2/accesscredentials/users/<id_appartamento>

Payload per un PIN numerico:

{
  "type": "PINCODE",
  "startTime": 1593605974000,
  "endTime": 1606825174000,
  "name": "Mario Rossi"
}

Payload per un QR code:

{
  "type": "QRCODE",
  "startTime": 1593605974000,
  "endTime": 1606825174000,
  "name": "Mario Rossi"
}

startTime e endTime sono timestamp in millisecondi e definiscono la finestra di validità.

Opzioni disponibili#

CampoEffetto
generateForOfflineMode: truegenera un codice intelligente, utilizzabile dal dispositivo anche quando è offline (solo per i PIN numerici)
payload: "<codice_pin>"imposta un valore scelto invece di lasciarlo generare al sistema
length: <lunghezza>lunghezza del PIN generato automaticamente
maxUsages: <numero>numero massimo di utilizzi complessivi del codice

Vincoli da rispettare#

  • Il campo name deve essere univoco per l'appartamento.
  • Un PIN impostato manualmente deve essere numerico e non può iniziare per 0 (i codici che iniziano con 0 sono i codici generici, non nominativi).
  • Il valore di un codice deve essere univoco a livello di impianto, anche rispetto a codici non più validi: per riusare un valore già assegnato occorre prima cancellare il codice esistente.

La risposta conferma il codice creato, con il suo id, il credentialType e il value effettivo.

Opzionalmente si può generare un link associato al codice, che permette di aprire da pagina web invece di digitare il codice sul dispositivo. È utile quando la postazione non ha tastierino né lettore QR:

POST /api/v2/accesscredentials/users/<id_appartamento>/links/<id_codice>

La risposta contiene il campo link, che è l'indirizzo da condividere con l'ospite.

Leggere e cancellare i codici#

Elenco dei codici di un appartamento:

GET /api/v2/accesscredentials/users/<id_appartamento>

Cancellazione, distinta per tipo di codice:

DELETE /api/v2/accesscredentials/users/<id_appartamento>/PINCODE/<id_codice>
DELETE /api/v2/accesscredentials/users/<id_appartamento>/QRCODE/<id_codice>

Notifica immediata in rete locale#

Dopo l'aggiunta o la cancellazione di un codice i dispositivi interessati vengono notificati via internet dalla piattaforma. Se serve un aggiornamento immediato, l'integratore che si trova sulla stessa rete del dispositivo può notificarlo anche in locale:

curl -X POST 'http://<indirizzo_ip>:8001/credential-changed/<id_appartamento>'

È un passaggio opzionale: serve solo ad anticipare la sincronizzazione già prevista dalla piattaforma.

Leggere i log di accesso#

Gli eventi di accesso si interrogano con una singola chiamata, filtrando per codice o per appartamento:

POST /api/v2/events/query

Ricerca per codice:

{
  "types": ["ACCESS"],
  "startDate": 1594112151000,
  "endDate": 1594976151000,
  "credentialIds": ["<id_codice>"],
  "page": 0,
  "pageSize": 10,
  "sortBy": "timestamp",
  "sortDir": "asc"
}

Ricerca per appartamento: identica, sostituendo credentialIds con userIds: ["<id_appartamento>"]. I campi startDate e endDate sono opzionali.

La risposta è paginata secondo i parametri inviati. Ogni evento riporta il dispositivo, il timestamp e, nel payload, il codice usato con il suo tipo e nome, l'appartamento e le uscite attivate; in eventMedia compaiono le eventuali immagini catturate al momento dell'accesso.

Note operative#

  • Le API esposte sono protette da un limite di frequenza sulle chiamate: conviene prevedere ritentativi con attesa progressiva.
  • Il token dell'impianto vale solo per quell'impianto: gestendo più edifici serve un login per ciascuno.
  • La documentazione di riferimento endpoint per endpoint è lo Swagger della piattaforma, su api.ipdoor.com, con esportazione JSON dello schema.
  • L'API cloud documentata non espone comandi di apertura porta: gestisce i codici e la lettura degli eventi.

In questa sezione

Questa voce raccoglie più sotto-sezioni: scegline una per approfondire.