IBM Cloud Docs
SPA (single-page application)

SPA (single-page application)

Con IBM Cloud® App ID, puoi velocemente aggiungere l'autorizzazione e l'autenticazione alle tue SPA (single-page application). Una SPA viene eseguita interamente nel tuo browser, non dispone di un backend da te gestito e non richiede che la pagina venga ricaricata mentre viene utilizzata l'applicazione. Alcuni quadri comuni che vengono utilizzati con SPAs sono Angular e React.

La tua applicazione ha un backend che controlli? La SPA non è il flusso per te. Prova il flusso dell'applicazione web!

Descrizione del flusso

Sebbene sia l'attuale standard di settore per le SPA, il gruppo di lavoro OAuth non raccomanda più l'uso del flusso implicito a causa di diversi problemi di sicurezza. In base ai loro consigli, App ID è configurato per utilizzare il flusso Authorization Code con PKCE.

{: caption="di autorizzazioni SPAIl flusso di autorizzazioni delle " caption-side="bottom"} a pagina singola

  1. Un utente tenta di accedere alla tua SPA (single-page application).
  2. L'SDK App ID crea un verificatore del codice per la richiesta di autorizzazione, ossia la versione in testo semplice della verifica del codice. Insieme alla richiesta di autorizzazione, il client invia la verifica del codice e il metodo di verifica utilizzato per codificare la verifica.
  3. Il flusso di autenticazione viene avviato da App ID in una nuova finestra.
  4. L'utente sceglie un provider di identità per l'autenticazione e completa il processo di accesso.
  5. L'SDK App ID sull'applicazione riceve il codice di concessione
  6. L'SDK effettua una richiesta XHR all'endpoint del token App ID insieme al codice di concessione e al verificatore del codice per ottenere i token di accesso e identità.

Stai utilizzando SSO per Cloud Directory? È possibile utilizzare l'SDK del client App ID per ottenere automaticamente una nuova coppia di token senza richiedere all'utente di effettuare l'accesso esplicito. Per ulteriori informazioni, vedi Accesso invisibile.

Perché codice di autorizzazione + PKCE?

A causa della loro natura, le SPA (single-page application) non possono memorizzare i segreti in modo sicuro. Il flusso autorizzazione + PKCE, una variazione del flusso del codice di autorizzazione OAuth 2.0, utilizza una verifica e un verificatore del codice monouso invece di un segreto per far fronte al problema. Il verificatore e la sfida garantiscono che l'entità che richiama gli endpoint di autorizzazione e token siano le stesse. Questo processo significa che un aggressore non sarebbe in grado di richiedere token dal server di autorizzazione senza conoscere anche il verificatore di codice.

Sebbene il flusso implicito sia l'attuale standard del settore, è possibile riscontrare diverse falle nella sicurezza. Ad esempio, il flusso implicito utilizza gli URI di reindirizzamento per ottenere i token, che il flusso autorizzazione + PKCE aggira utilizzando invece una richiesta XHR. A causa dei problemi di sicurezza, il flusso implicito non è più consigliato o considerato sicuro a causa dei seguenti motivi:

  • Il flusso Implicit restituisce i token come parte di URL- come parametro di query o nel frammento di hash. In questo modo, i token possono essere intercettati e vi si può accedere. I token potrebbero venire salvati nei log o nella cronologia del browser di un utente. La cronologia o i log potrebbero essere memorizzati in un servizio cloud e inviati a più dispositivi, cosa che aumenta i rischi.

  • Il flusso implicito è suscettibile di un attacco di redirect URI, il che significa che un aggressore potrebbe sostituire un URI di redirect approvato con una destinazione di sua scelta. Se avviene un attacco all'URI di reindirizzamento, gli utenti seguono il link modificato per autorizzare i propri client. Dopo l'autorizzazione, vengono reindirizzati all'URI dell'aggressore che gli fornisce l'accesso ai token legittimi dell'utente.

I precedenti esempi sono solo alcuni dei problemi importanti. Per ulteriori informazioni, consultare le migliori pratiche di sicurezza di OAuth 2.0.

Prima di cominciare

Prima di iniziare, assicurati di avere i seguenti prerequisiti.

  • Un'istanza del servizio App ID.
  • I tuoi URI di reindirizzamento impostati nel dashboard del servizio App ID.
  • Una SPA (single-page application). Se non ne hai una e vuoi provare il flusso, prova a scaricare l'applicazione di esempio dalla pagina della panoramica del dashboard App ID.

Creazione delle credenziali dell'applicazione con la GUI

Le tue credenziali sono utilizzate per connettere la tua applicazione a App ID. Per creare le tue credenziali, registra la tua applicazione con App ID.

Nelle credenziali SPA non viene restituito alcun segreto del cliente. Non è necessario un segreto nell'Autorizzazione + flusso PKCE. Non puoi utilizzare le credenziali dell'applicazione web normale nel tuo flusso SPA.

  1. Accedi al dashboard IBM Cloud nella regione in cui vuoi lavorare.
  2. Passa alla scheda Applications e fai clic su Add application.
  3. Dai un nome alla tua applicazione.
  4. Seleziona Single-page application dall'elenco a discesa Type.
  5. Fare clic su Salva.
  6. Nella tabella, fai clic su View credentials per visualizzare le informazioni necessarie nella seguente configurazione.

Creazione delle credenziali dell'applicazione con l'API

Le tue credenziali sono utilizzate per connettere la tua applicazione a App ID. Per creare le tue credenziali, registra la tua applicazione con App ID.

Nelle credenziali SPA non viene restituito alcun segreto del cliente. Non è necessario un segreto nell'Autorizzazione + flusso PKCE. Non puoi utilizzare le credenziali dell'applicazione web normale nel tuo flusso SPA.

  1. Effettuare la seguente richiesta di invio al /management/v4//applicazioni endpoint.

    curl -X POST \
    https://us-south.appid.cloud.ibm.com/management/v4/<tenantID>/applications/ \
    -H 'accept: application/json' \
    -H 'Authorization: Bearer <IAMToken>' \
    -H 'Content-Type: application/json' \
    -d '{"name": "MySampleSPA", "type": "singlepageapp"}'
    

    Risposta di esempio:

    {
       "clientId": "<clientID>",
       "tenantId": "<tenantID>",
       "name": "MySampleSPA",
       "oAuthServerUrl": "https://us-south.appid.cloud.ibm.com/oauth/v4/<tenantID>",
       "type": "singlepageapp"
    }
    

Configurazione dell'SDK JavaScript

Per installare l'SDK nella tua applicazione, utilizza la seguente procedura come guida.

  1. Utilizzando il prompt di comandi, passa alla directory che contiene la tua applicazione.

  2. Installa il servizio App ID utilizzando NPM o collegando la CDN nel tuo file HTML principale.

    • Per utilizzare NPM, immetti il seguente comando.

      npm install ibmcloud-appid-js
      
    • Per aggiungere la CDN, aggiungi il seguente link al tuo file HTML principale.

      <script src="https://cdn.appid.cloud.ibm.com/appid-0.3.0.min.js"></script>
      
  3. Aggiungi il tuo ID client e l'endpoint di rilevamento alla tua applicazione per inizializzare l'SDK.

    const appID = new AppID();
    await appID.init({
       clientId: '<spaClientID>',
       discoveryEndpoint: '<wellKnownEndpoint>'
    });
    
  4. Nel tuo codice dell'applicazione, dopo la configurazione del tuo pulsante di accesso, aggiungi una chiamata per l'accesso (signin). Si apre una finestra a comparsa in cui a un utente viene chiesto di immettere le proprie credenziali. Dopo una corretta autenticazione, la schermata si chiude e gli utenti sono autenticati.

    const tokens = await appID.signin();
    

Configurazione dell'accesso invisibile

Quando SSO per Cloud Directory è abilitato, puoi automaticamente ottenere dei nuovi token per un utente senza che debba riautenticarsi utilizzando l'accesso invisibile. Per abilitare l'accesso invisibile, utilizza la seguente procedura come guida.

I token di aggiornamento non vengono restituiti nel flusso SPA.

  1. Nel dashboard App ID, passa a Cloud Directory > Single Sign-on.

  2. Modifica Enable single sign-on su Enabled.

  3. Fare clic su Salva.

  4. Aggiungi il seguente codice alla tua applicazione. Assicurati di configurare la tua applicazione in modo da mostrare il pulsante di accesso se l'accesso invisibile ha esito negativo.

    const tokens = await appID.silentSignin();
    if (!tokens) {
       document.getElementById('login').addEventListener('click', async () => {
       const tokens = await appID.signin();
       });
    }