Convalida token
Perché convalidare i token? Quando l'applicazione Web controlla le credenziali direttamente, verifica che il nome utente e la password presentati corrispondano a quanto gestito. Quando si utilizza l'identità basata su richieste di rimborso, la mansione viene affidata in outsourcing a un provider di identità.
La responsabilità passa dalla verifica delle credenziali raw alla verifica che il richiedente sia passato attraverso il provider di identità preferito e sia stato autenticato correttamente. Il provider di identità rappresenta l'autenticazione riuscita mediante l'emissione di un token. Prima di poter utilizzare le informazioni o fare affidamento su di esse come asserzione che l'utente ha autenticato, è necessario convalidarle.
Documento di ricerca automatica OpenID
Il protocollo OpenID Connect 1.0 è un semplice livello di identità sopra il protocollo OAuth 2.0 che richiede l'uso di più endpoint per l'autenticazione degli utenti e per la richiesta di risorse che includono informazioni utente, token e chiavi pubbliche. Per aiutarti a scoprire quali sono questi endpoint che devi utilizzare, OpenID Connect ti consente di utilizzare un documento di ricerca automatica, che è un documento JSON trovato in una posizione ben nota. Questo documento di ricerca automatica contiene coppie chiave/valore che forniscono dettagli sulla configurazione del provider OpenID Connect, inclusi gli URI degli endpoint di autorizzazione, token, userinfo e chiavi pubbliche. È possibile recuperare il documento di ricerca automatica per il servizio OpenID Connect di un dominio di Identity IAM da: https://<domainURL>/.well-known/openid-configuration.
Consulta la documentazione sulla ricerca automatica di Oracle Identity Cloud Service OpenID.
Convalida dei token di identità
Un token identità (ID) è un token protetto dall'integrità e autonomo (in formato JSON Web Token) che contiene richieste di risarcimento relative all'utente finale. Rappresenta la sessione di un utente autenticato. Pertanto, il token deve essere convalidato prima che un'applicazione possa ritenere attendibile il contenuto del token ID. Ad esempio, se un utente malintenzionato ha ripetuto il token ID di un utente acquisito in precedenza, l'applicazione dovrebbe rilevare che il token è stato ripetuto o è stato utilizzato dopo la scadenza e negare l'autenticazione.
-
Verificare che il valore della richiesta di audience (
aud) contenga il valoreclient_iddell'applicazione. Il claimaud(audience) può contenere un array con più elementi. Il token ID deve essere rifiutato se il token ID non elenca il client come audience valida o se contiene audience aggiuntive che non sono attendibili dal client. -
Verificare che l'ora corrente sia precedente all'ora rappresentata dalla richiesta di tempo di scadenza (
exp). -
Verificare che il token ID sia firmato correttamente dall'emittente. I token emessi dal dominio di Identity IAM vengono firmati utilizzando uno dei certificati trovati nell'URI specificato nel campo
jwks_uridel documento di ricerca automatica.-
Recuperare il certificato pubblico del tenant dall'endpoint
SigningCert/jwk(ad esempio,https://acme.identity.oraclecloud.com/admin/v1/SigningCert/jwk).Nota
Poiché i domini di Identity cambiano raramente le chiavi pubbliche, è possibile memorizzare nella cache le chiavi pubbliche e, nella maggior parte dei casi, eseguire in modo efficiente la convalida locale. Ciò richiede il recupero e l'analisi dei certificati ed effettuare le chiamate crittografiche appropriate per controllare la firma: -
Utilizzare qualsiasi libreria JWT disponibile per convalidare, ad esempio, la libreria JWT Nimbus di Connect2id per Java. Per un elenco delle librerie disponibili, vedere JWT.
Nota
In caso di errore nella convalida della firma, per evitare che vengano recuperati costantemente in caso di attacchi con token fittizi, il recupero/riinserimento nella cache della chiave pubblica deve basarsi su un intervallo di tempo, ad esempio 60 minuti, in modo che i recuperi vengano eseguiti solo ogni 60 minuti.
Esempio
package sample; import java.net.MalformedURLException; import java.net.URL; import com.nimbusds.jose.JWSAlgorithm; import com.nimbusds.jose.jwk.source.JWKSource; import com.nimbusds.jose.jwk.source.RemoteJWKSet; import com.nimbusds.jose.proc.JWSKeySelector; import com.nimbusds.jose.proc.JWSVerificationKeySelector; import com.nimbusds.jose.proc.SecurityContext; import com.nimbusds.jwt.JWTClaimsSet; import com.nimbusds.jwt.proc.ConfigurableJWTProcessor; import com.nimbusds.jwt.proc.DefaultJWTProcessor; public class TokenValidation { public static void main(String[] args) { try { String tokenValue = "eyJ4NXQjUzI1....W9J4oQ"; ConfigurableJWTProcessor jwtProcessor = new DefaultJWTProcessor(); // change t JWKSource keySource = new RemoteJWKSet(new URL("https://<domainURL>/admin/v1/SigningCert/jwk")); // The expected JWS algorithm of the token (agreed out-of-band) JWSAlgorithm expectedJWSAlg = JWSAlgorithm.RS256; // Configure the JWT processor with a key selector to feed matching public // RSA keys sourced from the JWK set URL JWSKeySelector keySelector = new JWSVerificationKeySelector(expectedJWSAlg, keySource); jwtProcessor.setJWSKeySelector(keySelector); // Process the token SecurityContext ctx = null; // optional context parameter, not required here JWTClaimsSet claimsSet = jwtProcessor.process(tokenValue, ctx); // Print out the token claims set System.out.println(claimsSet.toJSONObject()); } catch (Exception e) { e.printStackTrace(); } } } -
-
Verificare che il valore della richiesta dell'identificativo emittente (
iss) corrisponda esattamente al valore della richiestaiss(emittente):https://<domainURL>/
Convalida dei token di accesso
-
Verificare che il token di accesso sia firmato correttamente dall'emittente.
-
Recuperare il certificato pubblico del tenant dall'endpoint
SigningCert/jwk(ad esempio, https://acme.identity.oraclecloud.com/admin/v1/SigningCert/jwk).Nota
Poiché i domini di Identity cambiano raramente le chiavi pubbliche, è possibile memorizzare nella cache le chiavi pubbliche e, nella maggior parte dei casi, eseguire in modo efficiente la convalida locale. Ciò richiede il recupero e l'analisi dei certificati ed effettuare le chiamate crittografiche appropriate per controllare la firma: -
Utilizzare qualsiasi libreria JWT disponibile per convalidare, ad esempio, la libreria JWT Nimbus di Connect2id per Java. Per un elenco delle librerie disponibili, vedere JWT.
-
Passare il certificato all'API della rispettiva libreria, ad esempio utilizzando l'API SignedJWT di Nimbus:
PublicKey = x509Certificate.getPublicKey(); // verify the signature. JWSVerifier verifier = new RSASSAVerifier((RSAPublicKey) (publicKey)); boolean isTokenValid = signedJWT.verify(verifier);Nota
In caso di errore nella convalida della firma, per evitare che vengano recuperati costantemente in caso di attacchi con token fittizi, il recupero/riinserimento nella cache della chiave pubblica deve basarsi su un intervallo di tempo, ad esempio 60 minuti, in modo che i recuperi vengano eseguiti solo ogni 60 minuti.
-
-
Verificare che il valore della richiesta dell'identificativo emittente (
iss) corrisponda esattamente al valore della richiestaiss(emittente):https://<domainURL>/ -
Verificare che il token di accesso contenga la richiesta di audience (
aud) richiesta dal client. Il valore della richiesta di rimborsoaudcambia da ambito a ambito. La richiestaaudè un array se sono presenti più audience ed è una stringa se esiste un solo audience.La richiesta
audè l'audience principale del server delle risorse dell'applicazione del dominio di Identity IAM. Se esistono audience secondarie definite nell'applicazione del dominio di Identity IAM, vengono aggiunte anche nell'ambito della richiestaaud. Come parte della convalida del token di accesso, il server deve consentire l'accesso se uno dei valori nell'arrayaudha senso per il server delle risorse. -
Verificare che l'ora corrente sia precedente all'ora rappresentata dalla richiesta di tempo di scadenza (
exp). -
Verificare che il token di accesso sia autorizzato a eseguire l'operazione in base al contenuto della richiesta di ambito. La richiesta di ambito nel token di accesso è una lista di stringhe separata da spazi.