Lab · 02 / 16
Accesso non è identità.
Spesso si usano come sinonimi, ma rispondono a domande diverse. OAuth 2.0 permette a un’app di agire per conto tuo. OpenID Connect, costruito sopra, dice all’app chi sei.
In parole semplici OAuth è la chiave da parcheggiatore: permette a qualcuno di guidare la tua auto, ma non dice chi sei. OpenID Connect aggiunge la carta d’identità: la prova di chi ha appena fatto l’accesso.
| OAuth 2.0autorizzazione | OpenID Connectautenticazione | |
|---|---|---|
| Domanda a cui risponde | Cosa può fare questa app per conto mio? | Chi è l’utente e come ha fatto l’accesso? |
| Standard | RFC 6749 (2012), un framework | OpenID Foundation (2014), uno strato sopra OAuth 2.0 |
| Token principale | Access token, formato non definito dalla specifica | ID token, sempre un JWT firmato |
| Chi legge il token | L’API (resource server) | L’app che ha chiesto il login (client) |
| Come lo chiedi | Scope come invoices:read | Lo scope openid, più profile ed email |
| Informazioni sull’utente | Non standardizzate | Claim standard e un endpoint UserInfo |
| Discovery | Metadata dell’authorization server (RFC 8414) | /.well-known/openid-configuration |
| Uso tipico | Un’app che chiama un’API, un servizio che chiama un servizio | Login e single sign-on per app web e mobile |
Quando usare OAuth 2.0
Usa solo OAuth 2.0 quando non c’è un utente da identificare o l’app deve solo chiamare un’API: client credentials, accesso delegato a un calendario.
Quando usare OpenID Connect
Usa OpenID Connect ogni volta che un’app deve sapere chi è l’utente. Nello stesso flusso ottieni comunque anche un access token.
L’errore più comune
Usare l’access token come prova del login. È stato emesso per l’API, non per l’app, quindi l’app non può sapere con certezza a chi appartiene. Anche il contrario è sbagliato: un’API non deve accettare un ID token come bearer token.
A confronto
// Access token: for the API
{
"iss": "https://idp.example.com",
"sub": "248289761001",
"aud": "https://api.example.com",
"client_id": "web-app",
"scope": "invoices:read",
"exp": 1760000900
}// ID token: for the app
{
"iss": "https://idp.example.com",
"sub": "248289761001",
"aud": "web-app",
"auth_time": 1759999995,
"amr": ["pwd", "otp"],
"nonce": "n-0S6_WzA2Mj",
"email": "ada@example.com"
}