Hinweis:

Mit einem von OCI-IAM-Domains ausgestellten JWT-Token auf geschützte Ressourcen in ORDS zugreifen

Einführung

Oracle Cloud Infrastructure Identity and Access Management (OCI IAM) verwendet Identitätsdomains, um Identitäts- und Zugriffsmanagementfeatures wie Authentifizierung, Single Sign-On (SSO) und Identitätslebenszyklusmanagement für OCI sowie für Oracle- und Nicht-Oracle-Anwendungen bereitzustellen, sowohl SaaS als auch in der Cloud gehostet oder On Premise.

Oracle REST Data Services (ORDS) überbrückt HTTPS und Ihre Oracle Database. ORDS ist eine Mid-Tier-Java-Anwendung und bietet eine Database Management-REST-API, SQL Developer Web, ein PL/SQL-Gateway, Simple Oracle Document Access (SODA) für REST sowie die Möglichkeit, RESTful-Webservices für die Interaktion mit den Daten und gespeicherten Prozeduren in Oracle Database zu veröffentlichen.

ORDS Release 23.3 bietet Unterstützung für JSON Web Token (JWT). Mit diesen Bearertoken können die ORDS-Entwickler Authentifizierung und Autorisierung an einen beliebigen OAuth2-konformen Identitätsprovider (IdP) delegieren, um ein JWT-Zugriffstoken auszugeben, das ORDS validieren kann, um Zugriff auf ORDS-geschützte Ressourcen zu ermöglichen.

In diesem Tutorial zeigen wir, wie Sie mit einem von OCI-IAM-Domains ausgegebenen JWT-Token auf geschützte Ressourcen in ORDS zugreifen. Für diese Demonstration verwenden wir eine Oracle Autonomous Database in OCI, die mit einer vorkonfigurierten und vollständig verwalteten ORDS-Anwendung geliefert wird.

Die folgende Abbildung zeigt die allgemeine Darstellung der Lösungsarchitektur.

Architekturdiagramm

Ziele

Voraussetzungen

Hinweis: Die OCI-IAM-Domain und das von ihr ausgegebene JWT-Token erfüllen alle oben genannten Anforderungen.

Aufgabe 1: ORDS für ein Datenbankschema einrichten, API-Endpunkte definieren und Zugriffskontrolle konfigurieren

  1. Melden Sie sich bei der OCI-Konsole an, navigieren Sie zu Oracle Database, und klicken Sie auf Autonomous Database.

  2. Klicken Sie auf Provisioned Autonomous Database Instance, Database Actions und dann auf SQL.

  3. Führen Sie die folgende Abfrage aus, um sicherzustellen, dass Sie die ORDS-Version 23.3 oder höher verwenden, die JWTs unterstützt.

    SELECT * FROM ORDS_METADATA.ORDS_VERSION;
    

    ORDS-Version

  4. Führen Sie die folgende Abfrage aus, um einen Benutzer (ordstest) zu erstellen und die erforderlichen Berechtigungen zuzuweisen.

    CREATE USER ordstest IDENTIFIED BY "<Password>";
    GRANT CONNECT, RESOURCE TO ordstest;
    ALTER USER ordstest DEFAULT ROLE CONNECT, RESOURCE;
    
  5. Führen Sie die folgende Abfrage aus, um ORDS für das Schema zu aktivieren und die REST-API-Funktionalität zuzulassen.

    BEGIN
     ORDS_ADMIN.ENABLE_SCHEMA(
         p_enabled => TRUE,
         p_schema => 'ordstest',
         p_url_mapping_type => 'BASE_PATH',
         p_url_mapping_pattern => 'ordstest',
         p_auto_rest_auth=> FALSE
     );
    commit;
    END;
    /
    
  6. Führen Sie die folgende Abfrage aus, um eine Tabelle mit dem Namen emp im Schema ordstest zu erstellen und Beispieldaten einzufügen.

    CREATE TABLE ordstest.emp (
    EMPNO NUMBER(4,0),
    ENAME VARCHAR2(10 BYTE),
    JOB VARCHAR2(9 BYTE),
    MGR NUMBER(4,0),
    HIREDATE DATE,
    SAL NUMBER(7,2),
    COMM NUMBER(7,2),
    DEPTNO NUMBER(2,0),
    CONSTRAINT PK_EMP PRIMARY KEY (EMPNO)
    );
    
    Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7369,'SMITH','CLERK',7902,to_date('17-DEC-80','DD-MON-RR'),800,null,20);
    Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7499,'ALLEN','SALESMAN',7698,to_date('20-FEB-81','DD-MON-RR'),1600,300,30);
    Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7521,'WARD','SALESMAN',7698,to_date('22-FEB-81','DD-MON-RR'),1250,500,30);
    Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7566,'JONES','MANAGER',7839,to_date('02-APR-81','DD-MON-RR'),2975,null,20);
    Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7654,'MARTIN','SALESMAN',7698,to_date('28-SEP-81','DD-MON-RR'),1250,1400,30);
    
  7. Führen Sie die folgende Abfrage aus, um ein ORDS-Modul (demo) zu definieren, das die API-Endpunkte enthält.

    BEGIN
      ORDS_ADMIN.DEFINE_MODULE(
         p_schema => 'ordstest',
         p_module_name => 'demo',
         p_base_path => '/demo/',
         p_items_per_page=> 1000,
         p_status => 'PUBLISHED',
         p_comments=> ''
     );
    COMMIT;
    END;
    /
    
  8. Führen Sie die folgende Abfrage aus, um eine Vorlage emp zu definieren, die einer bestimmten REST-Ressource zugeordnet ist.

    BEGIN
     ORDS_ADMIN.DEFINE_TEMPLATE(
         p_schema => 'ordstest',
         p_module_name => 'demo',
         p_pattern => 'emp',
         p_priority => 0,
         p_etag_type => 'HASH',
         p_comments => ''
     );
    COMMIT;
    END;
    /
    
  9. Führen Sie die folgende Abfrage aus, um einen GET-Anforderungs-Handler für emp zu erstellen, der eine einfache SQL-Abfrage ausführt, die Daten aus der Tabelle emp zurückgibt.

    BEGIN
     ORDS_ADMIN.DEFINE_HANDLER(
         p_schema => 'ordstest',
         p_module_name => 'demo',
         p_pattern => 'emp',
         p_method => 'GET',
         p_source_type => ords.source_type_collection_feed,
         p_source => 'select * from emp',
         p_items_per_page => 25,
         p_comments => ''
     );
    COMMIT;
    END;
    /
    

    Die Tabelle emp kann ohne Authentifizierung angezeigt werden, indem /ordstest/demo/emp an die öffentliche ORDS-Zugriffs-URL der autonomen Oracle-Datenbanken angehängt wird, die unter Toolkonfiguration verfügbar ist. Postman wird in diesem Tutorial verwendet.

    ANFORDERUNGS-URL

    Zugriff mit externer Autorisierung

  10. Führen Sie die folgende Abfrage aus, um eine Berechtigung (privilegetest) zum Schutz des Moduls demo zu definieren.

    DECLARE
    L_PRIV_ROLES owa.vc_arr;
    L_PRIV_PATTERNS owa.vc_arr;
    L_PRIV_MODULES owa.vc_arr;
    BEGIN
    L_PRIV_MODULES( 1 ) := 'demo';
    ORDS_ADMIN.DEFINE_PRIVILEGE(
      P_Schema=> 'ordstest',
      P_PRIVILEGE_NAME => 'privilegetest',
      P_ROLES => L_PRIV_ROLES,
      P_PATTERNS =>  L_PRIV_PATTERNS,
      P_MODULES => L_PRIV_MODULES,
      P_LABEL => 'privilegetest',
      P_DESCRIPTION => 'Demonstrate controlling access with priviliges',
      P_COMMENTS=> ''
      );
    COMMIT;
    END;
    /
    

    Da das demo-Modul durch die Berechtigung privilegetest geschützt ist, kann ohne entsprechende Autorisierung nicht auf es zugegriffen werden. Um den Zugriff zu aktivieren, müssen Sie ein JWT-Profil für das Schema ordstest erstellen. Dadurch kann ORDS JWT-Träger-Token validieren und Zugriff auf geschützte Ressourcen wie das Demomodul gewähren.

Aufgabe 2: ORDS-JWT-Profil erstellen

Ein JWT-Profil kann mit der Prozedur OAUTH.CREATE_JWT_PROFILE in einem REST-fähigen Schema erstellt werden. Pro Schema kann jedoch nur ein JWT-Profil definiert werden. Um ein vorhandenes JWT-Profil zu aktualisieren, muss es vor dem Erstellen eines neuen Profils gelöscht werden.

BEGIN
  OAUTH_ADMIN.DELETE_JWT_PROFILE(p_schema=>'ordstest');
  OAUTH_ADMIN.CREATE_JWT_PROFILE(
  p_schema => 'ordstest',
  p_issuer => 'https://idcs-123456789abcdefghijklmnopqrstuvw.identity.oraclecloud.com',
  p_audience => 'ords/ordstest/',
  p_jwk_url =>'https://idcs-123456789abcdefghijklmnopqrstuvw.identity.oraclecloud.com:443/admin/v1/SigningCert/jwk'
 );
COMMIT;
END;
/

Dieses JWT-Profil gibt den Aussteller, die Zielgruppe und die JWK-URL an.

Die Issuer und JWK URI für eine OCI-IAM-Domain können abgerufen werden, indem Sie eine GET-Anforderung an die OCI-IAM-Domain-URL senden und /.well-known/openid-configuration anhängen, wie in der folgenden Abbildung dargestellt.

IAM-Domainmetadaten

Um die JWT-Profilkonfiguration zu prüfen, melden Sie sich als Benutzer ordstest an, und führen Sie die folgende SQL-Abfrage aus.

SELECT * FROM ORDS_METADATA.USER_ORDS_JWT_PROFILE;

Diese Abfrage ruft die JWT-Profildetails ab und stellt sicher, dass Aussteller, Zielgruppe und JWK-URL korrekt konfiguriert sind.

ORDS JWT-Profil

Nachdem das JWT-Profil konfiguriert wurde, können Endbenutzer auf ORDS-geschützte Ressourcen zugreifen, indem sie JWT-Token anzeigen, die von einer OAuth 2.0-konformen IdP wie der im JWT-Profil angegebenen OCI-IAM-Domain ausgegeben werden. Wenn ein JWT-Träger-Token erfolgreich validiert wurde, akzeptiert ORDS Folgendes:

Aufgabe 3: ORDS-Zugriff auf das Signaturzertifikat der OCI-IAM-Domain ohne Authentifizierung aktivieren

  1. Gehen Sie zur OCI-Konsole, navigieren Sie zu Identität und Sicherheit, Identität, und klicken Sie auf Domains.

  2. Klicken Sie auf den Namen der Identitätsdomain, in der Sie arbeiten möchten. Möglicherweise müssen Sie das Compartment ändern, um die gewünschte Domain zu finden. Klicken Sie auf Einstellungen und Domaineinstellungen.

  3. Wählen Sie im Abschnitt Auf Signaturzertifikat zugreifen die Option Clientzugriff konfigurieren aus, und klicken Sie auf Änderungen speichern. Dadurch kann ORDS ohne Authentifizierung auf die Signaturzertifizierung für die Identitätsdomain zugreifen.

    Signaturzertifikat

Aufgabe 4: Ressourcenserver und -client, JWT-Geltungsbereiche und ORDS-Berechtigungen konfigurieren

Sie müssen IdP so konfigurieren, dass das JWT mit einem Geltungsbereich abgesetzt wird, der mit der erforderlichen ORDS-Berechtigung übereinstimmt. Wenn eine Ressource in ORDS durch eine Berechtigung geschützt ist, muss dieser Berechtigungsname als Geltungsbereich definiert werden. Mit diesem Geltungsbereich kann die Anwendung den Zugriff im Namen des Benutzers anfordern. Der ausgestellte JWT muss dann den Geltungsbereich als Anspruch einschließen. Da wir die OCI IAM OAuth2-Services zur Autorisierung verwenden werden, müssen wir einige Ressourcenserver und -clients einrichten.

Aufgabe 4.1: Vertrauliche Anwendung des Typs "Ressourcenserver" mit der gewünschten Zielgruppe und den gewünschten Geltungsbereichen erstellen

  1. Gehen Sie zur Identitätsdomain, in der Sie arbeiten, und klicken Sie auf Integrierte Anwendungen.

  2. Wählen Sie Anwendung hinzufügen, Vertrauliche Anwendung aus, und klicken Sie auf Workflow starten.

  3. Geben Sie einen Namen für die Anwendung ein (z.B. ORDS-SERVER), und klicken Sie auf Weiter.

  4. Wählen Sie im Abschnitt Resource Server-Konfiguration die Option Diese Anwendung jetzt als Resource Server konfigurieren aus.

  5. Konfigurieren Sie den Ressourcenserver mit primärer Zielgruppe, die mit dem JWT-Profil übereinstimmt und Geltungsbereich, der mit der ORDS-Berechtigung übereinstimmt.

    Konfiguration des Ressourcenservers

  6. Klicken Sie auf Weiter und Fertigstellen.

  7. Wählen Sie auf der Überblickseite der Anwendung die Option Activate aus, und bestätigen Sie, dass die Anwendung aktiviert werden soll. Die vertrauliche Anwendung ist aktiviert.

Aufgabe 4.2: Vertrauliche Anwendung des Typs "Client" erstellen, der die gewünschten Geltungsbereiche zugewiesen sind

  1. Gehen Sie zur Identitätsdomain, in der Sie arbeiten, und klicken Sie auf Integrierte Anwendungen.

  2. Wählen Sie Anwendung hinzufügen, Vertrauliche Anwendung aus, und klicken Sie auf Workflow starten.

  3. Geben Sie einen Namen für die Anwendung ein (z.B. ORDS-CLIENT), und klicken Sie auf Weiter.

  4. Wählen Sie im Abschnitt Clientkonfiguration die Option Diese Anwendung jetzt als Client konfigurieren aus.

  5. Wählen Sie im Abschnitt Autorisierung die Option Clientzugangsdaten aus.

    Hinweis: In diesem Tutorial verwenden wir Clientzugangsdaten als Erteilungstypen. Sie können je nach Ihren Anforderungen einen anderen Berechtigungstyp auswählen, z.B. Autorisierungscodeablauf für einen benutzerorientierten Client.

  6. Wählen Sie unter Clienttyp die Option vertraulich aus.

  7. Wählen Sie im Abschnitt Tokenausgabe-Policy die Option Spezifisch als Autorisierte Ressourcen aus.

  8. Klicken Sie auf Ressourcen hinzufügen, und wählen Sie unter Ressourcen die Option Geltungsbereich hinzufügen aus. Wählen Sie die gewünschten Geltungsbereiche für den Ressourcenserver aus, der in Aufgabe 4.1 erstellt wurde. Beispiel: privilegetest.

    Clientkonfiguration

  9. Klicken Sie auf Weiter und Fertigstellen.

  10. Wählen Sie auf der Seite Anwendungsüberblick die Option Aktivieren aus, und bestätigen Sie, dass die Anwendung aktiviert werden soll. Die vertrauliche Anwendung ist aktiviert.

  11. Kopieren Sie die Client-ID und das Client Secret dieser Clientanwendung. Diese Zugangsdaten sind für die Authentifizierung erforderlich.

Aufgabe 5: Anforderungen mit einem JWT-Bearer-Token an ORDS senden

Senden Sie eine Postanforderung (mit Postman) an den OCI-IAM-Domaintokenendpunkt mit dem Erteilungstyp client_credentials und dem Geltungsbereich privilegetest, wie in der folgenden Abbildung dargestellt.

Tokenendpunkt

Hinweis: Zielgruppe und Geltungsbereich müssen in das Geltungsbereichsfeld aufgenommen werden, wenn das Bearer-Token aus der OCI-IAM-Domain angefordert wird.

Clientzugangsdaten

Validieren Sie das JWT-Token für Geltungsbereiche, Aussteller und Zielgruppe.

JWT-Tokendetails

Jetzt kann auf die geschützte ORDS-Ressource (Demomodul) im Schema ordstest zugegriffen werden, indem ein gültiges JWT-Träger-Token mit der Get-Anforderung bereitgestellt wird, wie in der folgenden Abbildung dargestellt.

Zugriff mit JWT

ORDS validiert das Token, indem der Public Key aus der JWK-URL abgerufen und die Signatur des Tokens überprüft wird. Wenn die Signatur gültig ist, prüft ORDS, ob die Claims iss (Emittent) und aud (Zielgruppe) mit den im JWT-Profil definierten Claims übereinstimmen. Außerdem wird geprüft, ob der Geltungsbereichsanspruch der Berechtigung zum Schutz der Ressource entspricht. Wenn alle Bedingungen erfüllt sind, erhält der Benutzer Zugriff auf die geschützte Ressource.

Danksagungen

Weitere Lernressourcen

Sehen Sie sich andere Übungen zu docs.oracle.com/learn an, oder greifen Sie im Oracle Learning YouTube-Channel auf weitere kostenlose Lerninhalte zu. Besuchen Sie außerdem education.oracle.com/learning-explorer, um Oracle Learning Explorer zu werden.

Die Produktdokumentation finden Sie im Oracle Help Center.