Per eseguire l'autenticazione in Cloud IoT Core, ogni dispositivo deve preparare un token web JSON (JWT, RFC 7519). I JWT vengono utilizzati per l'autenticazione di breve durata tra i dispositivi e i bridge MQTT o HTTP. In questa pagina vengono descritti i requisiti di Cloud IoT Core per i contenuti del JWT.
Cloud IoT Core non richiede un metodo di generazione di token specifico. Una buona raccolta di librerie client helper è disponibile su JWT.io.
Quando crei un client MQTT, il JWT deve essere trasmesso nel campo password
del messaggio CONNECT
. Quando ti connetti tramite HTTP, devi includere un JWT nell'intestazione di ogni richiesta HTTP.
Creazione di JWT
I JWT sono composti da tre sezioni: un'intestazione, un payload (contenente un set di rivendicazioni) e una firma. L'intestazione e il payload sono oggetti JSON, che vengono serializzati in byte UTF-8 e poi codificati utilizzando la codifica base64url.
L'intestazione, il payload e la firma del JWT sono concatenati con punti (.
). Di conseguenza, un JWT in genere ha il seguente formato:
{Base64url encoded header}.{Base64url encoded payload}.{Base64url encoded signature}
L'esempio seguente illustra come creare un JWT Cloud IoT Core per un determinato progetto. Dopo aver creato il JWT, puoi connetterti al bridge MQTT o HTTP per pubblicare i messaggi da un dispositivo.
C++
Go
Java
Node.js
Python
Intestazione JWT
L'intestazione JWT è costituita da due campi che indicano l'algoritmo di firma e il tipo di token. Entrambi i campi sono obbligatori e ogni campo ha un solo valore. Cloud IoT Core supporta i seguenti algoritmi di firma:
- JWT
RS256
(RSASSA-PKCS1-v1_5 utilizzando SHA-256 RFC 7518 sec 3.3). Questo valore è espresso comeRS256
nel campoalg
dell'intestazione JWT. - JWT
ES256
(ECDSA utilizzando P-256 e SHA-256 RFC 7518 sec 3.4), definito in OpenSSL come curva prime256v1. Questo valore è espresso comeES256
nel campoalg
dell'intestazione JWT.
Oltre all'algoritmo di firma, devi fornire il formato del token JWT.
La rappresentazione JSON dell'intestazione è la seguente:
Per le chiavi RSA:
{ "alg": "RS256", "typ": "JWT" }
Per le chiavi Curve ellittiche:
{ "alg": "ES256", "typ": "JWT" }
L'algoritmo specificato nell'intestazione deve corrispondere ad almeno una delle chiavi pubbliche registrate per il dispositivo.
Rivendicazioni di JWT
Il payload JWT contiene un insieme di rivendicazioni e viene firmato utilizzando le chiavi asimmetriche. Il set di rivendicazioni JWT contiene informazioni sul JWT, come la destinazione del token, l'emittente, l'ora in cui è stato emesso e/o la durata del token. Come l'intestazione JWT, il set di rivendicazioni JWT è un oggetto JSON e viene utilizzato nel calcolo della firma.
Rivendicazioni obbligatorie
Cloud IoT Core richiede i seguenti campi di rivendicazione riservati. Potranno essere mostrate in qualsiasi ordine nel set di rivendicazioni.
Nome | Descrizione |
---|---|
iat |
("Emesso alle"): il timestamp di creazione del token, specificato in secondi dalle 00:00:00 UTC, 1 gennaio 1970. Il server potrebbe segnalare un errore se questo timestamp è troppo lontano nel passato o nel futuro (consentendo 10 minuti di disallineamento). |
exp |
("Scadenza"): il timestamp di validità del token, specificato in secondi dalle 00:00:00 UTC, 1 gennaio 1970. La durata massima di un token è 24 ore + disallineamento.
|
aud |
("Pubblico"): deve essere una singola stringa contenente l'ID progetto cloud in cui è registrato il dispositivo. Se la richiesta di connessione non corrisponde a questo ID progetto, l'autenticazione verrà rifiutata senza ulteriori analisi. |
La rivendicazione nbf
("Not Before") verrà ignorata e non è obbligatoria.
Di seguito è riportata una rappresentazione JSON dei campi riservati obbligatori in un set di richieste JWT di Cloud IoT Core:
{ "aud": "my-project", "iat": 1509654401, "exp": 1612893233 }
Firma JWT
La specifica JSON Web Signature (JWS) definisce i meccanismi della generazione della firma per JWT. L'input della firma è l'array di byte dei seguenti contenuti:
{Base64url encoded header}.{Base64url encoded claim set}
Per calcolare la firma, firma l'intestazione con codifica base64url, il set di rivendicazioni con codifica base64-url e una chiave segreta (ad esempio un file rsa_private.pem
) utilizzando l'algoritmo che hai definito nell'intestazione. La firma viene quindi codificata in base64url e il risultato è JWT. Nell'esempio seguente viene mostrato un JWT prima della codifica base64url:
{"alg": "RS256", "typ": "JWT"}.{"aud": "my-project", "iat": 1509654401, "exp": 1612893233}.[signature bytes]
Dopo la codifica finale, il JWT ha il seguente aspetto:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOiJteS1wcm9qZWN0IiwiZXhwIjoxNTA5NjUwODAxLCJpYXQiOjE1MDk2NTQ0MDF9.F4iKO0R0wvHkpCcQoyrYttdGxE5FLAgDhbTJQLEHIBPsbL2WkLxXB9IGbDESn9rE7oxn89PJFRtcLn7kJwvdQkQcsPxn2RQorvDAnvAi1w3k8gpxYWo2DYJlnsi7mxXDqSUCNm1UCLRCW68ssYJxYLSg7B1xGMgDADGyYPaIx1EdN4dDbh-WeDyLLa7a8iWVBXdbmy1H3fEuiAyxiZpk2ll7DcQ6ryyMrU2XadwEr9PDqbLe5SrlaJsQbFi8RIdlQJSo_DZGOoAlA5bYTDYXb-skm7qvoaH5uMtOUb0rjijYuuxhNZvZDaBerEaxgmmlO0nQgtn12KVKjmKlisG79Q
Aggiornamento dei JWT in corso...
Come descritto nelle rivendicazioni richieste, i token hanno date di scadenza. Se un dispositivo si connette tramite MQTT e il relativo token scade, il dispositivo si disconnette automaticamente da Cloud IoT Core. Puoi impedire al dispositivo di disconnettersi aggiornando automaticamente il token. I seguenti esempi illustrano come verificare se un token è scaduto e, in caso affermativo, come riconnettersi con un nuovo token senza disconnettere il dispositivo.