Freigeben über


Konfigurieren der benutzerdefinierten JWT-Authentifizierung (Okta, Auth0)

Der Daten-API-Generator unterstützt Identitätsanbieter von Drittanbietern über den benutzerdefinierten Authentifizierungsanbieter. Verwenden Sie diesen Ansatz, wenn Ihre Organisation Okta, Auth0 oder einen anderen OAuth 2.0/OpenID Connect-kompatiblen Identitätsanbieter verwendet.

Authentifizierungsfluss

Mit einem benutzerdefinierten Identitätsanbieter verarbeitet Ihre Client-App die Benutzerauthentifizierung und sendet dann das Zugriffstoken an den Daten-API-Generator:

Abbildung des benutzerdefinierten JWT-Authentifizierungsflusses mit einem Drittanbieteridentitätsanbieter.

Phase Folge
Benutzerauthentifizierung Der Benutzer meldet sich über den Identitätsanbieter an (Okta, Auth0 usw.)
Tokenerwerb Client-App empfängt ein Zugriffstoken vom IdP
API-Aufruf Der Client sendet das Token an DAB im Authorization Header.
Überprüfung DAB überprüft JWT (Aussteller, Zielgruppe, Signatur)
Autorisierung DAB extrahiert Rollen und wertet Berechtigungen aus.

Voraussetzungen

  • Ein Konto mit Ihrem Identitätsanbieter (Okta, Auth0 usw.)
  • Eine Anwendung, die in Ihrem Identitätsanbieter registriert ist
  • Installierte CLI des Daten-API-Generators (Installationshandbuch)
  • Eine vorhandene dab-config.json mit mindestens einer Entität

Kurzreferenz

Setting Wert
Provider Custom
Erforderlich für die Überprüfung iss, aud, expgültige Signatur
Erforderlich für die Autorisierung roles Anspruch, der die ausgewählte Rolle enthält
Token-Header Authorization: Bearer <token>
Rollenanspruchstyp roles (behoben, nicht konfigurierbar)
Rollenauswahl-Kopfzeile X-MS-API-ROLE

Schritt 1: Konfigurieren Ihres Identitätsanbieters

Die genauen Schritte hängen von Ihrem Anbieter ab. Hier sind die wichtigsten Werte, die Sie benötigen:

Zu erfassende Werte

Wert Wo sie zu finden ist Syntaxelemente
Aussteller-URL Dokumentation des Anbieters oder OAuth-Metadatenendpunkts DAB jwt.issuer (verwendet als JWT Authority)
Publikum Client-ID Ihrer Anwendung oder benutzerdefinierte API-ID DAB jwt.audience

Hinweis

DAB verwendet die konfigurierte jwt.issuer als JWT Authority. Signaturschlüssel werden automatisch über standardmäßige OpenID Connect-Metadaten (in der Regel <issuer>/.well-known/openid-configuration) ermittelt.

Okta-Beispiel

  1. Melden Sie sich bei der Okta Admin Console an.
  2. Navigieren Sie zu Anwendungen>Anwendungen.
  3. Erstellen oder Auswählen einer Anwendung.
  4. Notieren Sie sich die Client-ID (als Zielgruppe verwenden).
  5. Ihr Aussteller ist in der Regel https://<your-domain>.okta.com.

Auth0-Beispiel

  1. Melden Sie sich beim Auth0-Dashboard an.
  2. Navigieren Sie zuAnwendungs-APIs>.
  3. Erstellen oder Auswählen einer API.
  4. Notieren Sie sich den Bezeichner (zur Verwendung als Zielgruppe).
  5. Ihr Aussteller ist https://<your-tenant>.auth0.com/.

Von Bedeutung

Der Daten-API-Generator verwendet einen festen Anspruchstyp roles für die rollenbasierte Autorisierung. Dieser Wert kann nicht konfiguriert werden. Wenn Ihr Identitätsanbieter Rollen in einem anderen Anspruch ausgibt (wie groups oder permissions), konfigurieren Sie Ihren Anbieter so, dass er auch einen roles Anspruch ausgibt, oder führen Sie eine Aktion nach der Anmeldung durch, um Werte in einen roles Anspruch zu kopieren.

Schritt 2: Konfigurieren des Daten-API-Generators

Legen Sie den Authentifizierungsanbieter auf Custom fest und konfigurieren Sie die JWT-Einstellungen.

Befehlszeilenschnittstelle (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>/"

Resultierende Konfiguration

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

Schritt 3: Konfigurieren von Entitätsberechtigungen

Definieren Sie Berechtigungen für die Rollen, die Ihr Identitätsanbieter zuweist:

Befehlszeilenschnittstelle (CLI)

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

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

Resultierende Konfiguration

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

Schritt 4: Konfigurieren von Rollen in Ihrem Identitätsanbieter

DAB erwartet Rollen in einem roles Anspruch. Konfigurieren Sie Ihren Identitätsanbieter, um diesen Anspruch einzuschließen.

Okta: Hinzufügen von Gruppen als Rollen

  1. Wechseln Sie in der Okta-Verwaltungskonsole zurSicherheits-API>.
  2. Wählen Sie Ihren Autorisierungsserver aus.
  3. Wechseln Sie zur Registerkarte "Ansprüche ".
  4. Hinzufügen eines Anspruchs:
    • Name: roles
    • In Tokentyp einschließen: Zugriffstoken
    • Werttyp: Gruppen
    • Filter: Auswählen der einzuschließden Gruppen

Auth0: Hinzufügen von Rollen mit einer Aktion

  1. Wechseln Sie im Auth0-Dashboard zu "Aktionsbibliothek>".
  2. Erstellen Sie eine neue Aktion (Post Login Trigger).
  3. Fügen Sie Code hinzu, um Rollen einzuschließen:
exports.onExecutePostLogin = async (event, api) => {
  const roles = event.authorization?.roles || [];
  if (roles.length > 0) {
    api.accessToken.setCustomClaim('roles', roles);
  }
};
  1. Stellen Sie die Aktion bereit, und fügen Sie sie Ihrem Anmeldeablauf hinzu.

Tipp

Ausführliche Anleitungen zum Konfigurieren von JWT-Ansprüchen mit Okta finden Sie unter Implementieren von Advanced JWT Claims mit dem SDK von Okta.

Schritt 5: Testen der Konfiguration

  1. Starten des Daten-API-Generators:

    dab start
    
  2. Rufen Sie ein Token von Ihrem Identitätsanbieter ab. Verwenden Sie das SDK Ihres Anbieters oder ein Tool wie Postman.

  3. Überprüfen Sie das Token bei jwt.io , um Folgendes zu überprüfen:

    • Der aud Anspruch entspricht Ihrer konfigurierten Zielgruppe.
    • Der iss Claim stimmt mit Ihrem konfigurierten Herausgeber überein.
    • Der roles Anspruch enthält die erwarteten Werte.
  4. Aufrufen der API:

    curl -X GET "http://localhost:5000/api/Book" \
      -H "Authorization: Bearer <your-token>"
    
  5. Um eine benutzerdefinierte Rolle zu verwenden, schließen Sie die X-MS-API-ROLE Kopfzeile ein:

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

JWT-Überprüfungsdetails

Der Daten-API-Generator überprüft diese Aspekte des JWT:

Prüfen Description
Signature Überprüft mithilfe von Signaturschlüsseln, die über die konfigurierte jwt.issuer Autorität ermittelt wurden (OpenID Connect-Metadaten / JWKS)
Emittent Muss genau mit der Konfiguration übereinstimmen jwt.issuer
Publikum Muss genau mit der Konfiguration übereinstimmen jwt.audience
Ablauf Token darf nicht abgelaufen sein (exp claim)
Nicht vorher Token muss gültig sein (nbf Anspruch, falls vorhanden)

Problembehandlung

Symptom Mögliche Ursache Lösung
401 Unauthorized Ausstellerkonflikt Überprüfen Sie, ob der iss Claim genau übereinstimmt (einschließlich des nachgestellten Schrägstrichs)
401 Unauthorized Benutzergruppenkonflikt Überprüfen Sie, ob der aud Anspruch ihrem konfigurierten Wert entspricht.
401 Unauthorized Token abgelaufen Abrufen eines neuen Tokens
401 Unauthorized Metadaten nicht verfügbar Sicherstellen, dass DAB erreichbar ist <issuer>/.well-known/openid-configuration
403 Forbidden Rolle nicht im Token Hinzufügen der Rolle zur IdP-Konfiguration
403 Forbidden Fehlende rollenspezifische Anforderung Konfigurieren Sie Ihren IdP, um eine roles Anspruch einzuschließen
403 Forbidden Falscher Anspruchsname DAB verwendet Anspruchstyp roles (fest, nicht konfigurierbar)

Von Bedeutung

DAB verwendet derzeit den Claimtyp roles für alle Rollenüberprüfungen. Dieser Wert ist hartcodiert und kann nicht in groups, permissionsoder andere Anspruchsnamen geändert werden. Konfigurieren Sie Ihren Identitätsanbieter so, dass Rollen in einem Anspruch mit dem Namen roles ausgegeben werden.

Allgemeine Ausstellerformate

Provider Ausstellerformat
Okta https://<domain>.okta.com oder https://<domain>.okta.com/oauth2/default
Auth0 https://<tenant>.auth0.com/ (beachten Sie den nachgestellten Schrägstrich)
Azure AD B2C https://<tenant>.b2clogin.com/<tenant-id>/v2.0/
Keycloak https://<host>/realms/<realm>

Vollständiges Konfigurationsbeispiel

Okta-Konfiguration

{
  "$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"]
        }
      ]
    }
  }
}

Auth0-Konfiguration

{
  "$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": ["*"]
        }
      ]
    }
  }
}