Aggiornamenti di FedCM: API Login Status, API Error e API Auto-selected Flag

Chrome 120 spedisce l'API Login Status per FedCM. L'API Login Status (precedentemente nota come API IdP Sign-in Status) consente ai siti web, in particolare ai provider di identità, di segnalare al browser quando gli utenti accedono e escono. Questo indicatore viene utilizzato da FedCM per risolvere un problema di attacco temporale silenzioso e, in questo modo, consente a FedCM di operare senza cookie di terze parti completamente. Questo aggiornamento riguarda le ultime modifiche non compatibili con le versioni precedenti che abbiamo identificato in precedenza nell'intent to Ship of FedCM originale, nell'ambito del nostro ambito di lavoro.

Sebbene l'API Login Status migliori la proprietà di privacy e l'usabilità, una volta spedita, non è compatibile con le versioni precedenti. Se disponi già di un'implementazione di FedCM, assicurati di aggiornarla utilizzando le seguenti istruzioni.

Inoltre, Chrome offrirà due nuove funzionalità di Federated Credential Management (FedCM):

  • API Error: invia una notifica agli utenti quando il loro tentativo di accesso non va a buon fine con una UI nativa basata sulla risposta del server dall'endpoint dell'asserzione dell'ID, se presente.
  • API Flag selezionata automaticamente: invia una notifica al provider di identità (IdP) e alla parte responsabile (RP) se una credenziale è stata selezionata automaticamente durante la procedura.

API Login Status

L'API Login Status è un meccanismo tramite il quale un sito web, in particolare un IdP, informa il browser dello stato di accesso dell'utente all'IdP. Con questa API, il browser può ridurre le richieste non necessarie all'IdP e mitigare i potenziali attacchi di tempo.

Comunica al browser lo stato di accesso dell'utente

Gli IdP possono segnalare lo stato di accesso dell'utente al browser inviando un'intestazione HTTP o chiamando un'API JavaScript quando l'utente ha eseguito l'accesso sull'IdP o quando è disconnesso da tutti i suoi account IdP. Per ogni IdP (identificato dal relativo URL di configurazione), il browser conserva una variabile a tre stati che rappresenta lo stato di accesso con i possibili valori logged-in, logged-out e unknown. Lo stato predefinito è unknown.

Per indicare che l'utente ha eseguito l'accesso, invia un'intestazione HTTP Set-Login: logged-in in una navigazione di primo livello o in una richiesta di sottorisorse della stessa origine:

Set-Login: logged-in

In alternativa, chiama l'API JavaScript navigator.login.setStatus('logged-in') dall'origine dell'IdP:

navigator.login.setStatus('logged-in');

Queste chiamate registrano lo stato di accesso dell'utente come logged-in. Quando lo stato di accesso dell'utente è impostato su logged-in, l'RP che chiama FedCM invia richieste all'endpoint dell'elenco degli account dell'IdP e mostra gli account disponibili all'utente nella finestra di dialogo FedCM.

Per indicare che l'utente è disconnesso da tutti i suoi account, invia l'intestazione HTTP Set-Login: logged-out in una navigazione di primo livello o in una richiesta di sottorisorse della stessa origine:

Set-Login: logged-out

In alternativa, chiama l'API JavaScript navigator.login.setStatus('logged-out') dall'origine dell'IdP:

navigator.login.setStatus('logged-out');

Queste chiamate registrano lo stato di accesso dell'utente come logged-out. Quando lo stato di accesso dell'utente è logged-out, la chiamata alla FedCM ha esito negativo senza effettuare una richiesta all'endpoint dell'elenco degli account dell'IdP.

Lo stato unknown viene impostato prima che l'IdP invii un indicatore utilizzando l'API Login Status. Abbiamo introdotto questo stato per una transizione migliore, perché un utente potrebbe aver già eseguito l'accesso all'IdP al momento della spedizione di questa API. L'IdP potrebbe non avere la possibilità di segnalarlo al browser prima della chiamata a FedCM. In questo caso, inviamo una richiesta all'endpoint dell'elenco degli account dell'IdP e aggiorniamo lo stato in base alla risposta dall'endpoint dell'elenco degli account:

  • Se l'endpoint restituisce un elenco di account attivi, aggiorna lo stato in logged-in e apri la finestra di dialogo FedCM per visualizzare questi account.
  • Se l'endpoint non restituisce account, aggiorna lo stato in logged-out e non supera la chiamata FedCM.

Che cosa succede se la sessione utente scade? Consenti all'utente di accedere tramite un flusso di accesso dinamico.

Anche se l'IdP continua a informare lo stato di accesso dell'utente al browser, lo stato potrebbe non essere sincronizzato, ad esempio alla scadenza della sessione. Il browser tenta di inviare una richiesta con credenziali all'endpoint dell'elenco di account quando lo stato di accesso è logged-in, ma il server non restituisce alcun account perché la sessione non è più disponibile. In questo scenario, il browser può consentire all'utente di accedere all'IdP in modo dinamico tramite una finestra di dialogo.

La finestra di dialogo FedCM mostra un messaggio che suggerisce un accesso, come mostrato nell'immagine seguente.

Una finestra di dialogo di FedCM che suggerisce di accedere all'IdP.
Una finestra di dialogo di FedCM che suggerisce di accedere all'IdP.

Quando l'utente fa clic sul pulsante Continua, il browser apre una finestra di dialogo per la pagina di accesso dell'IdP.

Una finestra di dialogo di esempio.
Una finestra di dialogo di esempio visualizzata dopo aver fatto clic sull'accesso al pulsante IdP.

L'URL della pagina di accesso è specificato con login_url come parte del file di configurazione IdP.

{
  "accounts_endpoint": "/auth/accounts",
  "client_metadata_endpoint": "/auth/metadata",
  "id_assertion_endpoint": "/auth/idtokens",
  "login_url": "/login"
  }
}

La finestra di dialogo è una normale finestra del browser che contiene cookie proprietari. Qualunque cosa avvenga all'interno della finestra di dialogo spetta all'IdP e non sono disponibili handle delle finestre per effettuare una richiesta di comunicazione tra origini alla pagina RP. Dopo che l'utente ha eseguito l'accesso, l'IdP deve:

  • Invia l'intestazione Set-Login: logged-in o chiama l'API navigator.login.setStatus("logged-in") per informare il browser che l'utente ha eseguito l'accesso.
  • Chiama IdentityProvider.close() per chiudere la finestra di dialogo.
Un utente accede a una RP dopo aver eseguito l'accesso all'IdP utilizzando FedCM.
Un utente accede a una parte soggetta a limitazioni dopo aver eseguito l'accesso all'IdP utilizzando FedCM.

Puoi provare il comportamento dell'API Login Status nella nostra demo.

  1. Tocca il pulsante Vai all'IdP e accedi.
  2. Accedi con un account arbitrario.
  3. Seleziona Sessione scaduta dal menu a discesa Stato account.
  4. Premi il pulsante Aggiorna informazioni personali.
  5. Tocca il pulsante Visita l'RP per provare FedCM.

Dovresti essere in grado di osservare l'accesso all'IdP tramite il comportamento del modulo.

API Error

Quando Chrome invia una richiesta all'endpoint dell'asserzione dell'ID (ad esempio, quando un utente fa clic sul pulsante Continua come nella UI di FedCM o viene attivata la riautenticazione automatica), l'IdP potrebbe non essere in grado di emettere un token per motivi legittimi. Ad esempio, se il client non è autorizzato, il server è temporaneamente non disponibile e così via. Attualmente, Chrome non supera la richiesta silenziosamente in caso di errori di questo tipo e si limita a inviare una notifica all'RP rifiutando la promessa.

Con l'API Error, Chrome invia una notifica all'utente mostrando un'interfaccia utente nativa con le informazioni sull'errore fornite dall'IdP.

Una finestra di dialogo FedCM che mostra il messaggio di errore dopo che il tentativo di accesso dell'utente non va a buon fine. La stringa è associata al tipo di errore.
Una finestra di dialogo FedCM che mostra il messaggio di errore dopo che un tentativo di accesso da parte dell'utente non va a buon fine. La stringa è associata al tipo di errore.

API HTTP IdP

Nella risposta id_assertion_endpoint, l'IdP può restituire un token al browser se può essere emesso su richiesta. In questa proposta, nel caso in cui non sia possibile emettere un token, l'IdP può restituire una risposta di tipo "errore", con due nuovi campi facoltativi:

  1. code
  2. url
// id_assertion_endpoint response
{
  "error": {
     "code": "access_denied",
     "url": "https://idp.example/error?type=access_denied"
  }
}

Per il codice, l'IdP può scegliere uno degli errori noti dall'elenco di errori specificati OAuth 2.0 [invalid_request, unauthorized_client, access_denied, server_error e temporarily_unavailable] o utilizzare qualsiasi stringa arbitraria. Nel secondo caso, Chrome visualizza l'interfaccia utente di errore con un messaggio di errore generico e passa il codice all'RP.

Per url, identifica una pagina web leggibile con informazioni sull'errore per fornire ulteriori informazioni sull'errore agli utenti. Questo campo è utile per gli utenti perché i browser non possono fornire messaggi di errore avanzati in un'interfaccia utente nativa. Ad esempio, link per i passaggi successivi, dati di contatto dell'assistenza clienti e così via. Se un utente vuole saperne di più sui dettagli dell'errore e su come correggerlo, può visitare la pagina fornita dall'interfaccia utente del browser per ulteriori dettagli. L'URL deve essere dello stesso sito dell'IdP configURL.

try {
  const cred = await navigator.credentials.get({
    identity: {
      providers: [
        {
          configURL: 'https://idp.example/manifest.json',
          clientId: '1234',
        },
      ],
    }
  });
} catch (e) {
  const code = e.code;
  const url = e.url;
}

API Auto-Selected Flag

mediation: optional è il comportamento predefinito di mediazione utente nell'API Credential Management e attiva una riautenticazione automatica quando possibile. Tuttavia, la riautenticazione automatica potrebbe essere non disponibile per motivi noti solo al browser; quando non è disponibile, all'utente potrebbe essere richiesto di accedere con la mediazione utente esplicita, che è un flusso con proprietà diverse.

  • Dal punto di vista del chiamante dell'API, quando riceve un token ID, non ha visibilità sull'esito di un flusso di riautenticazione automatica. Per questo motivo è difficile valutare le prestazioni dell'API e migliorare l'esperienza utente di conseguenza.
  • Dal punto di vista dell'IdP, non sono ugualmente in grado di capire se si è verificata una riautenticazione automatica per la valutazione delle prestazioni. Inoltre, il coinvolgimento esplicita della mediazione degli utenti potrebbe essere utile per supportare ulteriori funzionalità relative alla sicurezza. Ad esempio, alcuni utenti potrebbero preferire un livello di sicurezza superiore, che richiede la mediazione utente esplicita nell'autenticazione. Se un IdP riceve una richiesta di token senza tale mediazione, potrebbe gestire la richiesta in modo diverso. Ad esempio, restituisci un codice di errore che consenta all'RP di chiamare nuovamente l'API FedCM con mediation: required.

Pertanto, fornire visibilità del flusso di riautenticazione automatica sarebbe vantaggioso per gli sviluppatori.

Con l'API Flag selezionata automaticamente, Chrome indica se è stata acquisita un'autorizzazione esplicita dell'utente toccando il pulsante Continua come con l'IdP e la RP, ogni volta che si è verificata una riautenticazione automatica o si è verificata una mediazione esplicita. La condivisione avviene solo dopo che è stata concessa l'autorizzazione utente per le comunicazioni IdP/RP.

Condivisione con l'IdP

Per condividere le informazioni con l'autorizzazione utente del post dell'IdP, Chrome include is_auto_selected=true nella richiesta POST inviata a id_assertion_endpoint:

POST /fedcm_assertion_endpoint HTTP/1.1
Host: idp.example
Origin: https://rp.example/
Content-Type: application/x-www-form-urlencoded
Cookie: 0x23223
Sec-Fetch-Dest: webidentity

account_id=123&client_id=client1234&nonce=Ct0D&disclosure_text_shown=true&is_auto_selected=true

Condivisione della parte soggetta a limitazioni

Il browser può condividere le informazioni con la parte soggetta a limitazioni in isAutoSelected tramite IdentityCredential:

const cred = await navigator.credentials.get({
  identity: {
    providers: [{
      configURL: 'https://idp.example/manifest.json',
      clientId: '1234'
    }]
  }
});

if (cred.isAutoSelected !== undefined) {
  const isAutoSelected = cred.isAutoSelected;
}

Interagisci e condividi il tuo feedback

Se hai feedback o riscontri problemi durante il test, puoi condividerli su crbug.com.

Foto di Ragazza con cappello rosso su Unsplash