Aggiornamenti di FedCM: API IdP Sign-In Status, suggerimento per l'accesso e altro ancora

Chrome 116 include funzionalità FedCM come l'API Login Hint, l'API User Info e l'API RP Context e avvia una prova dell'origine per l'API IdP Sign-In Status.

In Chrome 116, Chrome include le seguenti tre nuove funzionalità di Gestione delle credenziali federate (FedCM):

  • API Login Hint: specifica un account utente preferito per accedere.
  • API User Info: recupera le informazioni dell'utente di ritorno in modo che il provider di identità (IdP) possa visualizzare un pulsante di accesso personalizzato all'interno di un iframe.
  • API RP Context: utilizza un titolo diverso da "Accedi" nella dialog FedCM.

Inoltre, Chrome sta avviando un prova dell'origine per l'API Stato accesso IdP. L'API IdP Sign-in Status è un requisito e costituirà un'interruzione quando verrà rilasciata. Se hai già implementato FedCM, assicurati di partecipare alla prova dell'origine.

API Login Hint

Quando viene invocato FedCM, il browser mostra l'account con cui è stato eseguito l'accesso dal provider di identità (IdP) specificato. Quando l'IDP supporta più account, elenca tutti gli account con accesso.

Una finestra di dialogo FedCM che mostra più account utente.
Una finestra di dialogo FedCM che mostra più account utente

Dopo che l'utente ha eseguito l'accesso, a volte la terza parte attendibile (RP) gli chiede di eseguire nuovamente l'autenticazione. Tuttavia, l'utente potrebbe non essere sicuro di quale account abbia utilizzato. Se l'RP può specificare con quale account accedere, sarà più facile per l'utente scegliere un account. Il suggerimento di accesso è disponibile in Chrome 116 e consente all'RP di restringere l'elenco a un solo elemento.

Questa estensione aggiunge un array di login_hints nell'endpoint elenco account della risposta dell'IDP, con tutti i possibili tipi di filtro supportati dall'IDP. Ad esempio, la risposta degli account potrebbe avere il seguente aspetto quando un provider di identità supporta il filtro per email e ID:

{
  "accounts": [{
    "id": "demo1",
    "email": "demo1@example.com",
    "name": "John Doe",
    "login_hints": ["demo1", "demo1@example.com"],
    ...
  }, {
    "id": "demo2",
    "email": "demo2@example.com",
    "name": "Jane Doe",
    "login_hints": ["demo2", "demo2@example.com"],
    ...
  }, ...]
}

Passando login_hints nell'elenco degli account, l'RP può invocare navigator.credentials.get() con la proprietà loginHint come mostrato nell'esempio di codice seguente per mostrare in modo selettivo l'account specificato:

return await navigator.credentials.get({
  identity: {
    providers: [{
      configURL: "https://idp.example/manifest.json",
      clientId: "123",
      nonce: nonce,
      loginHint : "demo1@example.com"
    }]
  }
});

API User Info

I pulsanti di accesso decorati con il logo dell'IdP che consentono agli utenti di accedere con la federazione delle identità sono ormai comuni. Tuttavia, decorare il pulsante utilizzando l'icona del profilo dell'utente e le sue informazioni è ancora più intuitivo per accedere, soprattutto se un utente ha già eseguito la registrazione su questo sito web con l'IdP.

Pulsante Accedi con Google.
Pulsante Accedi con Google
Pulsante Accedi con Google personalizzato.
Pulsante Accedi con Google personalizzato

Il problema è che, poiché il pulsante personalizzato dipende dai cookie di terze parti nel dominio dell'IDP all'interno di un iframe per identificare l'utente che ha eseguito l'accesso al fine di visualizzare il pulsante, non sarà disponibile una volta ritiratI i cookie di terze parti.

L'API User Info, disponibile in Chrome 116, consente all'IDP di ottenere le informazioni dell'utente di ritorno dal server senza dipendere dai cookie di terze parti.

L'API dovrebbe essere chiamata dall'IDP da un iframe incorporato nel sito web del RP in modo da poter recuperare le informazioni dell'utente e visualizzare un pulsante personalizzato come se fosse parte della piattaforma RP. Con la chiamata all'API, il browser invia una richiesta all'endpoint elenco account, quindi restituisce un array di informazioni utente se:

  • L'utente ha eseguito l'accesso all'RP con l'IdP tramite FedCM in passato sulla stessa istanza del browser e i dati non sono stati cancellati.
  • L'utente ha eseguito l'accesso all'IdP nella stessa istanza del browser.
// Iframe displaying a page from the https://idp.example origin
const user_info = await IdentityProvider.getUserInfo({
    configUrl: "https://idp.example/fedcm.json",
    clientId: "client1234"
});

// IdentityProvider.getUserInfo returns an array of user information.
if (user_info.length > 0) {
  // Chrome puts returning accounts first, so the first account received is guaranteed to be a returning account.
  const name = user_info[0].name;
  const given_name = user_info[0].given_name;
  const display_name = given_name ? given_name : name;
  const picture = user_info[0].picture;
  const email = user_info[0].email;
  // Renders the personalized sign-in button with the information above.
}

Tieni presente che per consentire la chiamata di IdentityProvider.getUserInfo() da un iframe con la stessa origine dell'IDP, il codice HTML di incorporamento deve consentirlo esplicitamente con le norme relative alle autorizzazioni di identity-credentials-get.

<iframe src="https://fedcm-idp-demo.glitch.me" allow="identity-credentials-get"></iframe>

Puoi vederlo in azione all'indirizzo https://fedcm-rp-demo.glitch.me/button.

API RP Context

L'API RP Context, disponibile in Chrome 116, consente a un RP di modificare la stringa nella UI della finestra di dialogo FedCM in modo da poter supportare contesti di autenticazione predefiniti. Guarda gli screenshot seguenti per vedere le diverse opzioni:

Finestra di dialogo FedCM visualizzata con
Finestra di dialogo FedCM visualizzata con "Accedi a ****". Questa è l'opzione predefinita se non è specificato il contesto RP.
Finestra di dialogo FedCM visualizzata con
Finestra di dialogo FedCM visualizzata con "Registrati a ****"
Finestra di dialogo FedCM visualizzata con
Finestra di dialogo FedCM visualizzata con "Continua su ****"
Finestra di dialogo FedCM visualizzata con
Finestra di dialogo FedCM visualizzata con "Usa ****"

L'utilizzo è semplice: specifica identity.context come valore della proprietà "signin" (valore predefinito), "signup", "use" o "continue".

const credential = await navigator.credentials.get({
  identity: {
    // "signin" is the default, "signup", "use" and "continue" 
    // can also be used
    context: "signup", 
    providers: [{
      configURL: "https://idp.example/fedcm.json",
      clientId: "1234",
    }],
  }
});

Prova dell'origine dell'API Stato accesso IdP

Chrome avvia una prova dell'origine dell'API Stato accesso IdP su computer a partire da Chrome 116, seguita da Chrome per Android in un secondo momento. Le prove Origin ti consentono di accedere a una funzionalità nuova o sperimentale per creare funzionalità che gli utenti possono provare per un periodo di tempo limitato prima che la funzionalità venga resa disponibile per tutti.

L'API Stato accesso IdP è un meccanismo in cui un IdP informa il browser dello stato di accesso dell'utente sull'IdP. Con questa API, il browser può ridurre le richieste non necessarie all'IDP e mitigare i potenziali attacchi di temporizzazione.

Comunicare al browser lo stato di accesso dell'utente

Gli IdP possono segnalare lo stato di accesso dell'utente al browser inviando un header HTTP o chiamando un'API JavaScript, quando l'utente ha eseguito l'accesso all'IdP o quando ha eseguito la disconnessione da tutti i suoi account IdP. Il browser registra lo stato come uno dei seguenti: "accesso", "uscita" o "sconosciuto" (valore predefinito).

Per indicare che l'utente ha eseguito l'accesso, invia un'IdP-SignIn-Status: action=signin intestazione HTTP in una navigazione di primo livello o in una richiesta di risorsa secondaria dello stesso ambito:

IdP-SignIn-Status: action=signin

In alternativa, chiama l'API JavaScript IdentityProvider.login() dall'origine dell'IDP:

IdentityProvider.login()

Questi registreranno lo stato di accesso dell'utente come "accesso". Quando lo stato di accesso dell'utente è impostato su "accesso", la RP che chiama FedCM invia richieste all'endpoint dell'elenco di account dell'IDP e mostra all'utente gli account disponibili nella finestra di dialogo FedCM.

Per indicare che l'utente ha eseguito la disconnessione da tutti i suoi account, invia l'intestazione HTTP IdP-SignIn-Status: action=signout-all in una navigazione di primo livello o in una richiesta di risorsa secondaria dello stesso ambito:

IdP-SignIn-Status: action=signout-all

In alternativa, chiama l'API JavaScript IdentityProvider.logout() dall'origine dell'IDP:

IdentityProvider.logout()

Questi registreranno lo stato di accesso dell'utente come "accesso non eseguito". Quando lo stato di accesso dell'utente è "Ultima uscita", la chiamata a FedCM non va a buon fine e non viene effettuata alcuna richiesta all'endpoint dell'elenco di account dell'IDP.

Per impostazione predefinita, lo stato di accesso dell'IDP è impostato su "sconosciuto". Questo stato viene utilizzato prima che l'IdP invii un indicatore utilizzando l'API IdP Sign-In Status. Abbiamo introdotto questo stato per una transizione migliore perché un utente potrebbe aver già eseguito l'accesso all'IdP quando viene rilasciata questa API e l'IdP potrebbe non avere la possibilità di segnalarlo al browser al momento della prima chiamata di FedCM. In questo caso, inviamo una richiesta all'endpoint dell'elenco di account dell'IdP e aggiorniamo lo stato in base alla risposta dell'endpoint dell'elenco di account:

  • Se l'endpoint restituisce un elenco di account attivi, aggiorna lo stato su "accesso" e apri la finestra di dialogo FedCM per visualizzare gli account.
  • Se l'endpoint non restituisce account, aggiorna lo stato su "Uscire" e fai fallire la chiamata FedCM.

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

Anche se l'IdP continua a informare il browser dello stato di accesso dell'utente, potrebbe non essere sincronizzato, ad esempio quando la sessione scade. Il browser tenta di inviare una richiesta con credenziali all'endpoint dell'elenco di account quando lo stato di accesso è "accesso", ma il server la rifiuta perché la sessione non è più disponibile. In questo caso, il browser può consentire all'utente di accedere dinamicamente all'IdP tramite una finestra popup.

La finestra di dialogo FedCM mostrerà un messaggio, come mostrato nell'immagine seguente:

Una finestra di dialogo FedCM che suggerisce di accedere all&#39;IdP.
Una finestra di dialogo FedCM che suggerisce di accedere all'IdP.

Se fai clic sul pulsante Continua, il browser apre una finestra popup che indirizza l'utente alla pagina di accesso dell'IdP.

Una finestra popup visualizzata dopo aver fatto clic sul pulsante di accesso all&#39;IDP.
Una finestra popup visualizzata dopo aver fatto clic sul pulsante Accedi all'IdP.

L'URL della pagina di accesso (che deve essere l'origine dell'IdP) può essere specificato con signin_url all'interno del file di configurazione dell'IdP.

{
  "accounts_endpoint": "/auth/accounts",
  "client_metadata_endpoint": "/auth/metadata",
  "id_assertion_endpoint": "/auth/idtokens",
  "signin_url": "/signin"
  }
}

La finestra popup è una normale finestra del browser che utilizza cookie proprietari. Tutto ciò che accade all'interno della finestra dei contenuti dipende dall'IDP, ma non sono disponibili handle della finestra per effettuare una richiesta di comunicazione cross-origin alla pagina RP. Dopo che l'utente ha eseguito l'accesso, l'IdP deve:

  • Invia l'intestazione IdP-SignIn-Status: action=signin o chiama l'API IdentityProvider.login() per informare il browser che l'utente ha eseguito l'accesso.
  • Chiama IdentityProvider.close() per chiudersi (la finestra popup).
// User is signed in...
// Don't forget feature detection.
if (IdentityProvider) {
  // Signal to the browser that the user has signed in.
  IdentityProvider.close();
}
Un utente accede a un RP dopo aver eseguito l'accesso all'IdP utilizzando FedCM

Puoi provare il comportamento dell'API IdP Sign-In Status nella nostra demo. La sessione scade dopo tre minuti dall'accesso all'IdP di prova. Poi puoi osservare l'accesso all'IdP tramite il comportamento della finestra popup.

Partecipare alla prova dell'origine

Puoi provare l'API Stato accesso IdP localmente attivando un flag
di Chrome
chrome://flags#fedcm-idp-signin-status-api su
Chrome 116 o versioni successive.

Puoi anche attivare l'API IdP Sign-In Status registrando un trial di origine due volte:

Le prove delle origini ti consentono di provare nuove funzionalità e di fornire feedback sulla loro usabilità, praticità ed efficacia alla community degli standard web. Per maggiori informazioni, consulta la Guida alle prove dell'origine per gli sviluppatori web.

La prova dell'origine dell'API Stato accesso IdP è disponibile da Chrome 116 a Chrome 119.

Registra una prova dell'origine per l'IDP

  1. Vai alla pagina di registrazione per la prova di Origin.
  2. Fai clic sul pulsante Registrati e compila il modulo per richiedere un token.
  3. Inserisci l'origine dell'IDP come Origine web.
  4. Fai clic su Invia.
  5. Aggiungi un tag origin-trial <meta> all'inizio delle pagine che utilizzano IdentityProvider.close(). Ad esempio, potrebbe avere il seguente aspetto:
    <meta http-equiv="origin-trial" content="TOKEN_GOES_HERE">.

Registra una prova dell'origine di terze parti per il RP

  1. Vai alla pagina di registrazione per la prova di Origin.
  2. Fai clic sul pulsante Registrati e compila il modulo per richiedere un token.
  3. Inserisci l'origine dell'IDP come Origine web.
  4. Seleziona Corrispondenza di terze parti per iniettare il token con JavaScript in altre origini.
  5. Fai clic su Invia.
  6. Incorpora il token emesso su un sito web di terze parti.

Per incorporare il token in un sito web di terze parti, aggiungi il seguente codice alla biblioteca o all'SDK JavaScript pubblicato dall'origine dell'IDP.

const tokenElement = document.createElement('meta');
tokenElement.httpEquiv = 'origin-trial';
tokenElement.content = 'TOKEN_GOES_HERE';
document.head.appendChild(tokenElement);

Sostituisci TOKEN_GOES_HERE con il tuo token.

Coinvolgere e condividere feedback

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

Foto di Dan Cristian Pădureț su Unsplash