Consenti il riutilizzo delle passkey sui tuoi siti con richieste di origini correlate

Le passkey sono collegate a un sito web specifico e possono essere utilizzate solo per accedere al sito web per cui sono state create.

Questo viene specificato nell'ID della relying party (ID RP), che per le passkey create per il dominio example.com potrebbe essere www.example.com o example.com.

Sebbene gli ID RP impediscano l'utilizzo delle passkey come singola credenziale per l'autenticazione ovunque, creano problemi per:

  • Siti con più domini: gli utenti non possono utilizzare la stessa passkey per accedere a domini diversi specifici per paese (ad esempio example.com e example.co.uk) gestiti dalla stessa azienda.
  • Domini con brand: gli utenti non possono utilizzare la stessa credenziale in domini diversi utilizzati da un singolo brand (ad esempio acme.com e acmerewards.com).
  • App mobile: le app mobile spesso non hanno un proprio dominio, il che rende difficile la gestione delle credenziali.

Esistono soluzioni alternative basate sulla federazione delle identità e altre basate sugli iframe, ma in alcuni casi sono scomode. Le richieste di origine correlate offrono una soluzione.

Soluzione

Con le richieste di origine correlate, un sito web può specificare le origini autorizzate a utilizzare il suo ID RP.

In questo modo, gli utenti possono riutilizzare la stessa passkey su più siti che gestisci.

Per utilizzare le richieste di origine correlate, devi pubblicare un file JSON speciale in un URL specifico https://{RP ID}/.well-known/webauthn. Se example.com vuole consentire alle origini aggiuntive di utilizzarlo come ID RP, deve pubblicare il seguente file all'indirizzo https://example.com/.well-known/webauthn:

{
  "origins": [
    "https://example.co.uk",
    "https://example.de",
    "https://example-rewards.com"
  ]
}

La prossima volta che uno di questi siti effettua una chiamata per la creazione di una passkey (navigator.credentials.create) o l'autenticazione (navigator.credentials.get) che utilizza example.com come ID RP, il browser noterà un ID RP che non corrisponde all'origine della richiesta. Se il browser supporta le richieste di origine correlate, cerca prima un file webauthn in https://{RP ID}/.well-known/webauthn. Se il file esiste, il browser controlla se l'origine che effettua la richiesta è presente in allowlist. In caso affermativo, procede con i passaggi di creazione o autenticazione della passkey.

Se il browser non supporta le richieste di origine correlata, genera un SecurityError.

Supporto browser

Le richieste di origine correlata sono supportate su Chrome e Safari. A gennaio 2026, Firefox sta ancora valutando la funzionalità. Puoi monitorare lo stato nel problema relativo alla posizione degli standard Mozilla.

La seguente demo utilizza due siti, https://ror-1.glitch.me e https://ror-2.glitch.me. Per consentire agli utenti di accedere con la stessa passkey su entrambi i siti, utilizza le richieste di origine correlata per consentire a ror-2.glitch.me di utilizzare ror-1.glitch.me come ID RP.

Demo

https://ror-2.glitch.me implementa le richieste di origine correlata per utilizzare ror-1.glitch.me come ID RP, quindi sia ror-1 che ror-2 utilizzano ror-1.glitch.me come ID RP durante la creazione di una passkey o l'autenticazione con questa. Abbiamo anche implementato un database di passkey condiviso tra questi siti.

Osserva la seguente esperienza utente:

  • Puoi creare correttamente una passkey e autenticarti con questa su ror-2, anche se il suo ID RP è ror-1 (e non ror-2).
  • Una volta creata una passkey su ror-1 o ror-2, puoi utilizzarla per l'autenticazione sia su ror-1 sia su ror-2. Poiché ror-2 specifica ror-1 come ID RP, effettuare una richiesta di creazione o autenticazione di una passkey da uno di questi siti equivale a effettuare la richiesta su ror-1. L'ID RP è l'unico elemento che collega una richiesta a un'origine.
  • Una volta creata una passkey su ror-1 o ror-2, Chrome può compilarla automaticamente sia su ror-1 sia su ror-2.
  • Una credenziale creata su uno di questi siti avrà un ID RP di ror-1.
Chrome compila automaticamente i dati su entrambi i siti.
Grazie alle richieste di origine correlata, gli utenti possono utilizzare la stessa credenziale passkey su ror-1 e ror-2. Chrome compilerà automaticamente anche le credenziali.

Visualizza il codice:

  • Consulta il file /.well-known/webauthn configurato nel codebase ror-1.
  • Visualizza RP_ID_ROR occorrenze nel codebase ror-2.

Passaggio 1: implementa un database di account condivisi

Se vuoi che i tuoi utenti possano accedere con la stessa passkey su site-1 e site-2, implementa un database di account condiviso tra questi due siti.

Passaggio 2: configura il file JSON .well-known/webauthn in site-1

Innanzitutto, configura site-1.com in modo che consenta a site-2.com di utilizzarlo come ID RP. Per farlo, crea il file JSON webauthn:

{
    "origins": [
        "https://site-2.com"
    ]
}

L'oggetto JSON deve contenere una chiave denominata origins il cui valore è un array di una o più stringhe contenenti origini web.

Limitazione importante: massimo 5 etichette

Ogni elemento di questo elenco verrà elaborato per estrarre l'etichetta eTLD+1. Ad esempio, le etichette eTLD+1 di example.co.uk e example.de sono entrambe example. Tuttavia, l'etichetta eTLD+1 di example-rewards.com è example-rewards. In Chrome, il numero massimo di etichette è 5.

Passaggio 3: pubblica il file JSON .well-known/webauthn in site-1

Poi, pubblica il file JSON in site-1.com/.well-known/webauthn.

Ad esempio, in Express:

app.get("/.well-known/webauthn", (req, res) => {
  const origins = {
    origins: ["https://site-2.com"],
  };
  return res.json(origins);
});

In questo caso, utilizziamo express res.json, che imposta già il valore content-type ('application/json') corretto;

Passaggio 4: specifica l'ID RP in site-2

Nel codebase site-2, imposta site-1.com come ID RP ovunque sia necessario:

  • Al momento della creazione delle credenziali:
    • Imposta site-1.com come ID RP nella creazione delle credenziali options che vengono passate alla chiamata frontend navigator.credentials.create e in genere generate lato server.
    • Imposta site-1.com come ID RP previsto, mentre esegui le verifiche delle credenziali prima di salvarle nel database.
  • Dopo l'autenticazione:
    • Imposta site-1.com come ID RP nell'autenticazione options che viene passato alla chiamata frontend navigator.credentials.get e che in genere viene generato lato server.
    • Imposta site-1.com come ID RP previsto da verificare sul server, mentre esegui le verifiche delle credenziali prima di autenticare l'utente.

Risoluzione dei problemi

Popup del messaggio di errore in Chrome.
Messaggio di errore in Chrome al momento della creazione delle credenziali. Questo errore viene generato se il file `.well-known/webauthn` non viene trovato in `https://{RP ID}/.well-known/webauthn`.
Popup del messaggio di errore in Chrome.
Messaggio di errore in Chrome al momento della creazione delle credenziali. Questo errore viene generato se il file `.well-known/webauthn` viene trovato, ma non elenca l'origine da cui stai tentando di creare una credenziale.

Altre considerazioni

Condividi le passkey tra siti e app mobile

Le richieste di origine correlate consentono agli utenti di riutilizzare una passkey su più siti. Per consentire agli utenti di riutilizzare una passkey su un sito web e un'app mobile, utilizza le seguenti tecniche:

Condividi le password tra i siti

Le richieste di origine correlata consentono agli utenti di riutilizzare una passkey su più siti. Le soluzioni per la condivisione delle password tra i siti variano a seconda del gestore delle password. Per Gestore delle password di Google, utilizza Digital Asset Links . Safari ha un sistema diverso.

Ruolo dei gestori delle credenziali e degli user agent

Questo va oltre il tuo ambito di sviluppatore di siti, ma tieni presente che, a lungo termine, l'ID RP non dovrebbe essere un concetto visibile all'utente nello user agent o nel gestore delle credenziali utilizzato dagli utenti. Invece, gli user agent e i gestori delle credenziali dovrebbero mostrare agli utenti dove sono state utilizzate le loro credenziali. L'implementazione di questa modifica richiederà del tempo. Una soluzione temporanea potrebbe essere quella di mostrare sia il sito web attuale sia il sito di registrazione originale.