API Digital Credentials: identità sicura e privata sul web

Natalia Markoborodova
Natalia Markoborodova

Data di pubblicazione: 3 ottobre 2025

Siamo felici di annunciare che l'API Digital Credentials è ora abilitata per impostazione predefinita a partire da Chrome 141. Inoltre, iOS 26 aggiunge il supporto dell'API Digital Credentials a Chrome e ad altri browser. Questa API introduce un nuovo livello di sicurezza e privacy per la verifica dell'identità sul web, consentendo ai siti web di richiedere e ricevere informazioni verificabili dagli utenti in modo standardizzato.

Dopo una prova dell'origine riuscita, l'API Digital Credentials ora supporta sia la presentazione delle credenziali sullo stesso dispositivo su Android sia la presentazione cross-device su Chrome per computer.

Sfondo

La verifica dell'identità online è stata finora una procedura complessa, che spesso richiede agli utenti di caricare scansioni dei propri documenti di identità. Questa pratica spesso comporta la condivisione di più dati del necessario, il che crea notevoli problemi di privacy per gli utenti. Per gli sviluppatori, crea anche un rischio, in quanto devono assicurarsi che la loro soluzione sia in grado di elaborare e archiviare dati sensibili spesso non uniformi in modo sicuro e nel rispetto della privacy.

Allo stesso tempo, normative come eIDAS 2.0 impongono ai governi di fornire mezzi di identificazione digitale al pubblico. Questi portafogli di identità digitali devono essere in grado di contenere varie credenziali, tra cui la prova dell'identità e dell'età. I fornitori di servizi online possono richiedere queste credenziali per verificare l'identità dell'utente.

Riconoscendo il potenziale delle credenziali digitali di soddisfare sia le richieste di privacy degli utenti sia le esigenze degli sviluppatori di verificare i dati utente, la community degli standard web del W3C ha sviluppato una soluzione: l'API Digital Credentials. L'API Digital Credentials mira a risolvere il problema introducendo un'interfaccia integrata per la verifica delle informazioni utente, che migliora la sicurezza, la privacy e l'esperienza utente rispetto alle alternative. Con questa API, gli utenti non devono più caricare documenti sensibili come scansioni di documenti di identità su più siti web. I siti web possono invece creare fiducia con i propri utenti richiedendo solo i dati specifici firmati crittograficamente di cui hanno bisogno da emittenti attendibili.

Funzioni principali

L'API Digital Credentials si basa su tre principi fondamentali: privacy, supporto multipiattaforma e standardizzazione.

Privacy

L'API Digital Credentials migliora la privacy e la sicurezza online. Consente agli utenti di presentare un documento di identità digitale dai propri wallet mobili ai siti web per verificare fatti specifici senza divulgare i dati sensibili sottostanti. Ad esempio, l'API può verificare che un utente abbia più di 18 anni senza rivelare la sua data di nascita completa. Questo principio di "divulgazione selettiva" garantisce che i siti web ricevano solo le informazioni minime necessarie.

L'API Digital Credentials è compatibile anche con i protocolli Zero Knowledge Proofs (ZKP), come Longfellow ZK di Google, che garantisce la privacy dell'utente restituendo una prova crittografica che una determinata asserzione di identità è vera senza rivelare altre informazioni.

Supporto su più piattaforme

L'API Digital Credentials mira a supportare diverse piattaforme, in modo che gli utenti possano presentare comodamente informazioni verificate su tutti i dispositivi.

Su Android:fornisce un'interfaccia utente integrata che consente agli utenti di selezionare le credenziali dall'app portafoglio installata.

Su computer:gli utenti possono presentare le credenziali dal proprio portafoglio mobile a un sito web nel browser del computer. Scansionando un codice QR, il sistema stabilisce una connessione sicura, crittografata end-to-end e resistente al phishing tra il computer e il dispositivo mobile. Questa connessione utilizza il protocollo CTAP per verificare la vicinanza dell'utente tramite BLE, assicurandosi che sia fisicamente presente e che controlli entrambi i dispositivi.

Standardizzazione

L'interoperabilità è fondamentale. In Chrome, l'API Digital Credentials è indipendente dalla piattaforma del protocollo ed è compatibile con vari protocolli di presentazione, ad esempio OpenID4VP e l'allegato C della norma ISO 18013-7. Apple ha anche introdotto il supporto dell'API Digital Credentials a partire da Safari 26.0.

Inoltre, l'API Digital Credentials si basa sul supporto integrato per la gestione delle credenziali in Android e su un ecosistema in crescita di portafogli compatibili. Google Wallet è un pioniere, con il supporto di Samsung Wallet e 1Password in arrivo.

Novità rispetto alla prova dell'origine

Per chi ha partecipato alla nostra precedente prova dell'origine, noterai che l'API Digital Credentials è stata spostata da navigator.identity.get() a navigator.credentials.get(), in linea con l'impegno più ampio di unificazione dell'identità con l'API Credential Management. Inoltre, il parametro providers è stato rinominato in requests e request è stato rinominato in data.

Implementazione

L'integrazione dell'API Digital Credentials prevede due passaggi principali: il rilevamento delle funzionalità e la richiesta della credenziale. Gli sviluppatori devono anche implementare una logica personalizzata per determinare se la loro applicazione può utilizzare le credenziali.

Rilevamento delle funzionalità

Prima di mostrare un pulsante "Verifica con credenziali digitali", controlla se l'API Digital Credentials è disponibile nel browser dell'utente.

if (typeof DigitalCredential !== "undefined") {
  // Digital Credentials API is supported
} else {
  // Digital Credentials API is not supported
}

Richiedere una credenziale

La richiesta di una credenziale comporta una chiamata a navigator.credentials.get() con un parametro digital. All'interno del tipo di credenziale digitale, aggiungi un array requests contenente DigitalCredentialGetRequest con i seguenti parametri di base:

  • protocol: specifica un protocollo di scambio con una stringa. Ad esempio,"openid4vp" o "org-iso-mdoc". Rileva se il protocollo è supportato dal browser nel seguente modo:

    if (DigitalCredential.userAgentAllowsProtocol("example-protocol")) {
        // Create a request with this protocol
      } else {
        // Protocol is not supported
    }
    
  • data: un oggetto con i parametri accettati dalle app di portafoglio digitale per il protocollo specificato. Per "openid4vp", i parametri sono definiti in OpenID for Verifiable Presentation (OID4VP) per la specifica dell'API W3C Digital Credentials.

    try {
      const digitalCredential = await navigator.credentials.get({
        digital: {
          requests: [{
            protocol: "openid4vp-v1-unsigned",
            data: {
              response_type: "vp_token",
          nonce: "[some-nonce]",
              client_metadata: {...},
          dcql_query: {...}
            }
        }]
        }
      });
    
      // Decrypt payload respons and verify credentials on the backend
      const response = await fetch("/verify", {
        method: "POST",
          body: JSON.stringify(digitalCredential.data),
          headers: {
              'Content-Type': 'application/json'
          }
      });
    } catch (e) {
      // Handle errors, such as the user canceling the request
      console.error(e);
    }
    

Ad esempio, per richiedere il cognome, il nome e un valore booleano che indica se l'utente ha più di 21 anni, puoi specificare il seguente payload:

{
  protocol: 'openid4vp-v1-unsigned',
  data: {
    response_type: 'vp_token',
    nonce: '[some-nonce]',
    // Contains the Verifier metadata values, including supported credential formats and response encryption public key
    client_metadata: {
  // Supported credential formats. Refer to the documentation for specific values
        vp_formats_supported: {...},
   // Public key(s). Refer to the documentation for more detail.
        jwks: {...}
    },
    dcql_query: {
      // A wallet will try to find credentials it holds that match these definitions.
      credentials: [
        {
          // A locally unique identifier for this credential definition within the query.
          id: "cred_vc",
          format: "dc+sd-jwt",
          meta: {
            // 'vct_values' specifies the Verifiable Credential allowed type.
            // In this case, it's a European Digital Identity (EUDI) Personal Identification Data (PID) credential.
            vct_values: [
              "urn:eudi:pid:1"
            ]
          },
          // 'claims' is an array of specific data that's being requested.
          claims: [
            {
              // The path ["age_equal_or_over", "18"] corresponds to accessing `credential.age_equal_or_over['18']`.
              path: [
                "age_equal_or_over",
                "18"
              ]
            }
          ]
        }
      ]
    }
  }
}

In questo esempio, client_metadata deve specificare un elenco di formati supportati. Consulta le specifiche per vedere quali valori possono essere utilizzati. Il valore facoltativo jwks impostato in client_metadata deve contenere le chiavi pubbliche utilizzate per la crittografia della risposta. Puoi anche consultare il codice demo per altri esempi.

Ecco un esempio di payload di risposta crittografato dell'oggetto DigitalCredential:

{
    // This is an example for a response using an OpenID4VP protocol.
    // The format of the 'data' object will differ for other protocols.
    "protocol": "openid4vp-v1-unsigned",
    "data": {
        // To decrypt this JWE payload, use the private key.
   // The decrypted payload will be a JSON object containing the
       // Verifiable Presentation in the 'vp_token' claim.
        "response": "[jwe-token]"
    }
}

In questo esempio, il sistema richiede le credenziali con il protocollo openid4vp-v1-unsigned e la risposta contiene response nella proprietà data.

Il modo esatto per analizzare la risposta dipende dal protocollo. In genere, devi:

  1. Decripta il payload della risposta. Il metodo di decrittografia dipende dal protocollo utilizzato. Scopri come decriptare il payload per openid4vp (utilizzando JWE) e org-iso-mdoc (utilizzando la crittografia ibrida a chiave pubblica).
  2. Verifica delle firme e dell'emittente. Per maggiori dettagli, consulta la documentazione Accettazione online delle credenziali digitali.

Per visualizzare esempi di codice per diversi protocolli, consulta il codice della demo o la versione ospitata live.

Verificare l'attendibilità dell'emittente

La firma crittografica delle credenziali digitali dimostra che sono autentiche. Tuttavia, gli sviluppatori devono verificare che l'emittente sia adatta e attendibile per il loro caso d'uso specifico. Ad esempio, per concedere uno sconto per studenti universitari, un sito di e-commerce richiederebbe una credenziale emessa da un'università accreditata e rifiuterebbe una credenziale firmata da altre entità. Un modo comune per verificare l'affidabilità dell'emittente è mantenere un elenco di emittenti approvati e rifiutare qualsiasi emittente che non corrisponde.

Inizia

È tutto pronto per iniziare a creare? Ecco quello che devi sapere.

  • Disponibilità: Chrome 141 o versioni successive attivano l'API Digital Credentials per impostazione predefinita su diverse piattaforme.
  • Prerequisiti: gli utenti hanno bisogno di un dispositivo compatibile, ad esempio Android con Google Play Services versione 24.0 o successive oppure un dispositivo iOS con versione 26 o successive. Il dispositivo deve avere installata un'applicazione di portafoglio digitale che supporti l'API Digital Credentials, ad esempio Google Wallet o un portafoglio demo.
  • Prova la demo:il modo migliore per comprendere l'esperienza utente e testare l'implementazione è provare la demo live all'indirizzo https://verifier.multipaz.org con Chrome 141 o versioni successive.

Risorse

Per saperne di più, consulta le seguenti risorse:

Condividi il tuo feedback

Ora che l'API Digital Credentials è stata rilasciata, ci piacerebbe conoscere la tua esperienza di sviluppo con questa API. Segnala un problema per condividere il tuo feedback o segnalare eventuali bug.