Configurare l'autenticazione JWT personalizzata (Okta, Auth0)

Il generatore di API dati supporta provider di identità di terze parti tramite il provider di autenticazione personalizzato usando la convalida del token Web JSON (JWT). Usare questo approccio quando l'organizzazione usa Okta, Auth0 o un altro provider di identità conforme a OAuth 2.0/OpenID Connect.

Flusso di autenticazione

Con un provider di identità personalizzato, l'app client gestisce l'autenticazione utente e quindi invia il token di accesso al generatore di API dati:

Diagramma che mostra il flusso di autenticazione JWT personalizzato con un provider di identità di terze parti.

Fase Che succede
Autenticazione utente L'utente accede tramite il provider di identità (Okta, Auth0 e così via)
Acquisizione di token L'app client riceve un token di accesso dal provider di identità (IdP)
Chiamata API Il client invia il token a DAB nell'intestazione Authorization
Convalida DAB valida il token JWT (emittente, pubblico, firma)
Autorizzazione DAB estrae i ruoli e valuta le autorizzazioni

Prerequisiti

  • Un account con il provider di identità (Okta, Auth0 e così via)
  • Un'applicazione registrata nel provider di identità
  • CLI di Data API Builder installata (guida all'installazione)
  • Un dab-config.json esistente con almeno un'entità

Riferimento rapido

Impostazione Valore
Provider Custom
Obbligatorio per la convalida iss, audexp, firma valida
Obbligatorio per l'autorizzazione roles attestazione che contiene il ruolo selezionato
Intestazione del token Authorization: Bearer <token>
Tipo di attestazione del ruolo roles (fisso, non configurabile)
Intestazione di selezione ruolo X-MS-API-ROLE

Passaggio 1: Configurare il provider di identità

I passaggi esatti dipendono dal provider. Ecco i valori chiave necessari:

Valori da raccogliere

Valore Dove trovarlo Usato per
URL dell'emittente Documentazione del provider o endpoint di metadati OAuth DAB jwt.issuer (usato come autorità JWT)
Destinatari ID client dell'applicazione o identificatore DELL'API personalizzato DAB jwt.audience

Annotazioni

DAB usa l'oggetto configurato jwt.issuer come JWT Autorità. Le chiavi di firma vengono individuate automaticamente tramite i metadati standard di OpenID Connect (di <issuer>/.well-known/openid-configurationsolito).

Esempio Okta

  1. Accedere alla console di amministrazione di Okta.
  2. Passare ad Applicazioni>.
  3. Creare o selezionare un'applicazione.
  4. Prendere nota dell'ID client (usare come gruppo di destinatari).
  5. L'autorità emittente è https://<your-domain>.okta.com in genere.

Esempio di Auth0

  1. Accedere al dashboard Auth0.
  2. Naviga su Applicazioni>API.
  3. Creare o selezionare un'API.
  4. Prendere nota dell'identificatore (usare come gruppo di destinatari).
  5. L'autorità emittente è https://<your-tenant>.auth0.com/.

Importante

Il generatore di API dati usa un tipo di attestazione fisso di roles per l'autorizzazione basata su ruoli. Questo valore non può essere configurato. Se il provider di identità emette i ruoli in un claim diverso, ad esempio groups o permissions, configuralo in modo che emetta anche un claim roles. Gli utenti di Auth0 dovrebbero esaminare il conflitto di namespacing noto prima di procedere.

Passaggio 2: Configurare il generatore di API dati

Impostare il provider di autenticazione su Custom e configurare le impostazioni JWT:

CLI

# Set the authentication provider
dab configure \
  --runtime.host.authentication.provider Custom

# Set the expected audience
dab configure \
  --runtime.host.authentication.jwt.audience "<your-api-identifier>"

# Set the expected issuer
dab configure \
  --runtime.host.authentication.jwt.issuer "https://<your-issuer>/"

Configurazione risultante

{
  "runtime": {
    "host": {
      "authentication": {
        "provider": "Custom",
        "jwt": {
          "audience": "<your-api-identifier>",
          "issuer": "https://<your-issuer>/"
        }
      }
    }
  }
}

Passaggio 3: Configurare le autorizzazioni per le entità

Definire le autorizzazioni per i ruoli assegnati dal provider di identità:

CLI

# Allow authenticated users to read
dab update Book \
  --permissions "authenticated:read"

# Allow users with 'admin' role full access
dab update Book \
  --permissions "admin:*"

Configurazione risultante

{
  "entities": {
    "Book": {
      "source": "dbo.Books",
      "permissions": [
        {
          "role": "authenticated",
          "actions": ["read"]
        },
        {
          "role": "admin",
          "actions": ["*"]
        }
      ]
    }
  }
}

Passaggio 4: Configurare i ruoli nel provider di identità

DAB prevede ruoli in una roles richiesta. Configurare il provider di identità per includere questa attestazione.

Okta: Aggiungere gruppi come ruoli

  1. Nella console di amministrazione di Okta passareall'API>.
  2. Selezionare il server di autorizzazione.
  3. Passare alla scheda Attestazioni .
  4. Aggiungere un'attestazione:
    • Nome: roles
    • Includere nel tipo di token: Token di accesso
    • Tipo di valore: Gruppi
    • Filtro: selezionare i gruppi da includere

Auth0: Aggiungere ruoli con un'azione

Auth0 richiede che i claim personalizzati utilizzino nomi namespaced resistenti alle collisioni (ad esempio, https://example.com/roles). Le attestazioni senza spazio dei nomi che entrano in conflitto con i nomi riservati vengono escluse dal token senza notifica. Per altre informazioni, vedere Creare attestazioni personalizzate nella documentazione di Auth0.

Data API Builder si aspetta il nome esatto del claim roles, non una variante con namespace. Se Auth0 accetta un claim senza spazio dei nomi roles dipende dalla configurazione del tenant.

  1. Nella dashboard Auth0, vai su Azioni>Libreria.

  2. Creare una nuova Azione (Post Login trigger).

  3. Aggiungere il codice per includere i ruoli:

    exports.onExecutePostLogin = async (event, api) => {
      const roles = event.authorization?.roles || [];
      if (roles.length > 0) {
        api.accessToken.setCustomClaim('roles', roles);
      }
    };
    
  4. Distribuire l'Azione e aggiungerla al flusso di autenticazione.

  5. Verificare il token di accesso decodificato in jwt.io e verificare che l'attestazione roles sia presente.

Warning

Auth0 può omettere silenziosamente l'attestazione roles senza namespace, a seconda delle impostazioni del tenant. Se il claim non è presente nel token, controlla Impostazioni>Avanzate nella dashboard di Auth0 per verificare l'applicazione dello spazio dei nomi. I tenant che richiedono claim con namespace non sono attualmente compatibili con l'autorizzazione basata sui ruoli per ruoli personalizzati di Data API builder. I ruoli predefiniti authenticated e anonymous continuano a funzionare perché non dipendono da un claim roles.

Suggerimento

Per indicazioni dettagliate sulla configurazione delle attestazioni JWT con Okta, vedere Personalizzare i token restituiti da Okta.

Passaggio 5: Testare la configurazione

  1. Avviare il generatore di API dati:

    dab start
    
  2. Acquisire un token dal provider di identità. Usare l'SDK del provider o uno strumento come Postman.

  3. Esaminare il token in jwt.io per verificare:

    • L'attestazione aud corrisponde al gruppo di destinatari configurato
    • La dichiarazione corrisponde al tuo emittente iss configurato
    • L'attestazione roles contiene i valori previsti
  4. Chiamare l'API:

    curl -X GET "http://localhost:5000/api/Book" \
      -H "Authorization: Bearer <your-token>"
    
  5. Per usare un ruolo personalizzato, includere l'intestazione X-MS-API-ROLE :

    curl -X GET "http://localhost:5000/api/Book" \
      -H "Authorization: Bearer <your-token>" \
      -H "X-MS-API-ROLE: admin"
    

Dettagli di convalida JWT

Il generatore di API dati convalida questi aspetti del token JWT:

Controllo Descrizione
firma Convalidato usando chiavi di firma individuate tramite l'autorità configurata jwt.issuer (metadati OpenID Connect o set di chiavi Web JSON (JWKS))
Emittente Deve corrispondere esattamente alla jwt.issuer configurazione
Destinatari Deve corrispondere esattamente alla jwt.audience configurazione
Scadenza Il token non deve essere scaduto (exp attestazione)
Non prima Il token deve essere valido (nbf attestazione, se presente)

Risoluzione dei problemi

Sintomo Possibile causa Soluzione
401 Unauthorized Mancata corrispondenza del mittente Controllare che la dichiarazione iss corrisponda esattamente (inclusa la barra finale)
401 Unauthorized Discordanza del pubblico Controllare che l'attestazione aud corrisponda al valore configurato
401 Unauthorized Token scaduto Acquisire un nuovo token
401 Unauthorized Metadati non disponibili Assicurarsi che DAB possa raggiungere <issuer>/.well-known/openid-configuration
403 Forbidden Ruolo non nel token Aggiungere il ruolo alla configurazione IdP
403 Forbidden Nessuna roles attestazione trovata Configura il tuo IdP per includere un'attestazione roles
403 Forbidden Nome reclamo errato DAB utilizza il tipo di attestazione roles (fisso, non configurabile)
403 Forbidden Attestazione personalizzata Auth0 eliminata automaticamente Auth0 può scartare claim personalizzati senza namespace. Verificare che l'attestazione roles esista nel token decodificato in jwt.io. Vedere Auth0: Aggiungere ruoli con un'azione

Importante

Il tipo di attestazione roles è codificato in modo statico per tutte le verifiche dei ruoli e non può essere modificato. Configurare il provider di identità per generare un'attestazione denominata esattamente roles. Gli utenti Auth0 devono esaminare il conflitto di spazio dei nomi.

Formati comuni dell'autorità emittente

Provider Formato emittente
Okta https://<domain>.okta.com oppure https://<domain>.okta.com/oauth2/default
Autenticazione 0 https://<tenant>.auth0.com/ (si noti la barra finale)
Azure AD B2C https://<tenant>.b2clogin.com/<tenant-id>/v2.0/
Keycloak https://<host>/realms/<realm>

Esempio di configurazione completo

Configurazione di Okta

{
  "$schema": "https://github.com/Azure/data-api-builder/releases/latest/download/dab.draft.schema.json",
  "data-source": {
    "database-type": "mssql",
    "connection-string": "@env('SQL_CONNECTION_STRING')"
  },
  "runtime": {
    "host": {
      "authentication": {
        "provider": "Custom",
        "jwt": {
          "audience": "0oa1234567890abcdef",
          "issuer": "https://dev-12345.okta.com"
        }
      }
    }
  },
  "entities": {
    "Book": {
      "source": "dbo.Books",
      "permissions": [
        {
          "role": "authenticated",
          "actions": ["read"]
        },
        {
          "role": "editor",
          "actions": ["create", "read", "update"]
        }
      ]
    }
  }
}

Configurazione di Auth0

{
  "$schema": "https://github.com/Azure/data-api-builder/releases/latest/download/dab.draft.schema.json",
  "data-source": {
    "database-type": "mssql",
    "connection-string": "@env('SQL_CONNECTION_STRING')"
  },
  "runtime": {
    "host": {
      "authentication": {
        "provider": "Custom",
        "jwt": {
          "audience": "https://my-api.example.com",
          "issuer": "https://my-tenant.auth0.com/"
        }
      }
    }
  },
  "entities": {
    "Book": {
      "source": "dbo.Books",
      "permissions": [
        {
          "role": "authenticated",
          "actions": ["read"]
        },
        {
          "role": "admin",
          "actions": ["*"]
        }
      ]
    }
  }
}