Microsoft Identity Platform e il flusso di concessione delle autorizzazioni per dispositivi OAuth 2.0
Microsoft Identity Platform supporta la concessione dell'autorizzazione del dispositivo, che consente agli utenti di accedere a dispositivi con vincoli di input, ad esempio una smart TV, un dispositivo IoT o una stampante. Per abilitare questo flusso, il dispositivo richiede all'utente di visitare una pagina Web nel browser in un altro dispositivo per l'accesso. Dopo che l'utente ha eseguito l'accesso, il dispositivo è in grado di ottenere i token di accesso e i token di aggiornamento in base alle esigenze.
Questo articolo descrive come programmare direttamente in base al protocollo nell'applicazione. Quando possibile, è consigliabile usare le librerie di autenticazione Microsoft (MSAL) supportate anziché acquisire i token e chiamare le API Web protette. Per esempi, vedere le app di esempio che usano MSAL.
Diagramma del protocollo
L'intero flusso di codice del dispositivo è illustrato nel diagramma seguente. In questo articolo viene illustrato ogni passaggio.
Richiesta di autorizzazione per il dispositivo
Il client deve prima di tutto verificare sul server di autenticazione un codice dispositivo e utente, usati per avviare l'autenticazione. Il client raccoglie la richiesta dall'endpoint /devicecode
. Nella richiesta, il client deve includere anche le autorizzazioni che deve acquisire dall'utente.
Dal momento in cui viene inviata la richiesta, l'utente ha 15 minuti per accedere. Questo è il valore predefinito per expires_in
. La richiesta deve essere effettuata solo quando l'utente indica che è pronto per l'accesso.
// Line breaks are for legibility only.
POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/devicecode
Content-Type: application/x-www-form-urlencoded
client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&scope=user.read%20openid%20profile
Parametro | Condizione | Descrizione |
---|---|---|
tenant |
Richiesto | Può essere /common , /consumers o /organizations . Può anche essere il tenant della directory da cui si vuole richiedere l'autorizzazione in formato GUID o nome descrittivo. |
client_id |
Richiesto | L'ID applicazione (client) che l'esperienza Interfaccia di amministrazione di Microsoft Entra: Registrazioni app ha assegnato all'app. |
scope |
Richiesto | Elenco separato da spazi di ambiti a cui si vuole che l'utente dia il consenso. |
Risposta di autorizzazione per il dispositivo
Una risposta di esito positivo sarà un oggetto JSON contenente le informazioni necessarie per consentire all'utente di eseguire l'accesso.
Parametro | Formato | Descrizione |
---|---|---|
device_code |
Stringa | Stringa lunga usata per verificare la sessione tra il client e il server di autorizzazione. Il client usa questo parametro per richiedere al server di autorizzazione il token di accesso. |
user_code |
String | Una stringa breve visualizzata dall'utente, usata per identificare la sessione in un dispositivo secondario. |
verification_uri |
URI | L'URI a cui l'utente deve passare con il user_code per eseguire l'accesso. |
expires_in |
int | Il numero di secondi prima della scadenza del device_code e del user_code . |
interval |
int | Numero di secondi di attesa del client tra le richieste di polling. |
message |
String | Stringa leggibile con le istruzioni per l'utente. Può essere localizzata includendo un parametro di query nella richiesta del form ?mkt=xx-XX , compilando l'apposito codice della lingua di destinazione. |
Nota
Il campo di risposta verification_uri_complete
non è incluso o supportato in questo momento. Questo viene menzionato perché se si legge lo standard si noterà che verification_uri_complete
è elencato come parte facoltativa dello standard del flusso di codice del dispositivo.
Autenticazione dell'utente
Dopo che il client riceve user_code
e verification_uri
, i valori vengono visualizzati e l'utente viene indirizzato all'accesso tramite il browser per dispositivi mobili o PC.
Se l'utente esegue l'autenticazione con un account personale, usando /common
o /consumers
, viene chiesto di eseguire di nuovo l'accesso per trasferire lo stato di autenticazione al dispositivo. Ciò è dovuto al fatto che il dispositivo non è in grado di accedere ai cookie dell'utente. Viene chiesto di fornire il consenso alle autorizzazioni richieste dal client. Tuttavia, questo non si applica agli account aziendali o dell'istituto di istruzione usati per l'autenticazione.
Mentre l'utente esegue l'autenticazione all'verification_uri
, il client deve eseguire il polling dell'endpoint /token
per il token richiesto usando il device_code
.
POST https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded
grant_type=urn:ietf:params:oauth:grant-type:device_code&client_id=00001111-aaaa-2222-bbbb-3333cccc4444&device_code=GMMhmHCXhWEzkobqIHGG_EnNYYsAkukHspeYUk9E8...
Parametro | Richiesto | Descrizione |
---|---|---|
tenant |
Richiesto | Lo stesso alias tenant o tenant usato nella richiesta iniziale. |
grant_type |
Richiesto | Deve essere urn:ietf:params:oauth:grant-type:device_code |
client_id |
Richiesto | Deve corrispondere al client_id usato nella richiesta iniziale. |
device_code |
Richiesto | Il device_code restituito nella richiesta di autorizzazione del dispositivo. |
Errori previsti
Il flusso del codice del dispositivo è un protocollo di polling in modo che gli errori serviti al client devono essere previsti prima del completamento dell'autenticazione utente.
Errore | Descrizione | Azione client |
---|---|---|
authorization_pending |
L'utente non ha ancora terminato l'autenticazione, ma non ha annullato il flusso. | Ripetere la richiesta dopo almeno interval secondi. |
authorization_declined |
L'utente finale ha rifiutato la richiesta di autorizzazione. | Arrestare il polling e ripristinare uno stato non autenticato. |
bad_verification_code |
Il device_code inviato all'endpoint /token non è stato riconosciuto. |
Verificare che il client stia inviando il device_code corretto nella richiesta. |
expired_token |
Il valore di expires_in è stato superato e l'autenticazione non è più possibile con device_code . |
Arrestare il polling e ripristinare uno stato non autenticato. |
Risposta di autenticazione di esito positivo
Una risposta di token con esito positivo ha un aspetto simile al seguente:
{
"token_type": "Bearer",
"scope": "User.Read profile openid email",
"expires_in": 3599,
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...",
"refresh_token": "AwABAAAAvPM1KaPlrEqdFSBzjqfTGAMxZGUTdM0t4B4...",
"id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJub25lIn0.eyJhdWQiOiIyZDRkMTFhMi1mODE0LTQ2YTctOD..."
}
Parametro | Formato | Descrizione |
---|---|---|
token_type |
Stringa | Sempre Bearer . |
scope |
Stringhe separate da uno spazio | Se è stato restituito un token di accesso, verranno elencati gli ambiti per cui è valido. |
expires_in |
int | Numero di secondi per cui il token di accesso incluso verrà considerato valido. |
access_token |
Stringa opaca | Emessa per gli ambiti che sono stati richiesti. |
id_token |
JWT | Emessa nel parametro scope originale incluso nell'ambito openid . |
refresh_token |
Stringa opaca | Emessa nel parametro scope originale incluso offline_access . |
È possibile usare il token di aggiornamento per acquisire nuovi token di accesso e token di aggiornamento usando lo stesso flusso documentato nella documentazione del flusso del codice OAuth.
Avviso
Non tentare di convalidare o leggere i token per qualsiasi API di cui non si è proprietari, inclusi i token in questo esempio, nel codice. I token per i servizi Microsoft possono usare un formato speciale che non verrà convalidato come token JWT e potrebbe anche essere crittografato per gli utenti (account Microsoft). Sebbene la lettura dei token sia uno strumento utile per il debug e l'apprendimento, è consigliabile non dipendere da questo per il codice o presupporre specifiche sui token che non sono per un'API che si controlla.