Mit Tokens über die Identitätsföderation von Arbeitslasten authentifizieren

In diesem Dokument wird beschrieben, wie Sie sich mithilfe von Tokens über die Identitätsföderation von Arbeitslasten bei Google Cloudauthentifizieren. Mit der Workload Identity-Föderation können Sie lokalen oder Multi-Cloud-SAP-Arbeitslasten Zugriff auf Google Cloud-Ressourcen gewähren, ohne dass ein Dienstkontoschlüssel verwendet wird.

Die Identitätsföderation von Arbeitslasten entspricht der Spezifikation des OAuth 2.0-Tokenaustauschs. Sie geben Anmeldedaten von Ihrem Identitätsanbieter an den Security Token Service weiter, der die Identität auf den Anmeldedaten prüft und dann ein föderiertes Zugriffstoken zurückgibt. Sie können dieses föderierte Zugriffstoken direkt mit unterstützten Diensten verwenden oder damit die Identität eines Dienstkontos übernehmen und ein kurzlebiges Zugriffstoken abrufen. Mit diesem Token können Sie alle Google Cloud APIs aufrufen, auf die das Dienstkonto Zugriff hat.

Sie können die Workload Identity-Föderation mit einem Metadatenserver oder einem externen Identitätsanbieter (IdP) verwenden.

Workload Identity-Föderation mit VM-Metadaten

Wenn Ihr SAP-System in Google Cloud gehostet, aber von SAP verwaltet wird, können Sie die Workload Identity-Föderation verwenden, um von Ihrem SAP-System aus sicher auf Ressourcen in anderenGoogle Cloud -Projekten zuzugreifen. Mit der Identitätsföderation von Arbeitslasten kann sich Ihr SAP-System mithilfe der VM-Metadaten bei anderen Google Cloud Projekten authentifizieren. So müssen keine Dienstkontoschlüssel mehr verwaltet werden, was die Sicherheit erhöht und die Authentifizierung vereinfacht.

Es müssen folgende allgemeine Konfigurations-Schritte ausgeführt werden:

  1. Konfigurieren Sie die Identitätsföderation von Arbeitslasten in Google Cloud.
  2. Erstellen Sie ein Dienstkonto in Google Cloud.
  3. Weisen Sie dem Dienstkonto in Google CloudZugriff auf den Pool der Identitätsföderation von Arbeitslasten zu.
  4. Konfigurieren Sie den Clientschlüssel im ABAP SDK for Google Cloud.

Identitätsföderation von Arbeitslasten konfigurieren

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für das Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Konfigurieren der Identitätsföderation von Arbeitslasten benötigen:

Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff verwalten.

Führen Sie die folgenden Schritte aus, um die Identitätsföderation von Arbeitslasten zu konfigurieren:

  1. Rufen Sie in der Google Cloud Console die Seite Neuer Arbeitslastanbieter und -Pool auf.

    Zum neuen Arbeitslastanbieter und -anbieterpool

  2. Geben Sie im Abschnitt Identitätspool erstellen Werte für die folgenden Felder ein:

    • Name ist der Name für den Pool. Der Name wird auch als Pool-ID verwendet. Sie können die Pool-ID später nicht ändern.
    • Beschreibung: Text, der den Zweck des Pools beschreibt.
  3. Klicken Sie auf Weiter.

  4. Fügen Sie unter Anbieter zum Pool hinzufügen den Metadatenserver als Anbieter hinzu:

    1. Wählen Sie im Feld Anbieter auswählen die Option OpenID Connect (OIDC) aus.
    2. Geben Sie die folgenden Anbieterdetails ein:

      • Anbietername: Geben Sie einen Namen für den Anbieter ein.
      • Aussteller(URL): Gib die Token-URL des Metadatenservers ein, https://accounts.google.com.
      • Zielgruppe: Wählen Sie Zugelassene Zielgruppe aus und geben Sie die Nummer des Google Cloud-Projekts ein, auf das Sie zugreifen möchten. Informationen zum Abrufen der Projektnummer finden Sie unter Details zur Google-Metadatenserverinstanz abrufen.
  5. Klicken Sie auf Weiter.

  6. Führen Sie unter Anbieterattribute konfigurieren die folgenden Schritte aus:

    • Achten Sie darauf, dass im Feld Google 1 der Wert google.subject ist.
    • Geben Sie im Feld OIDC 1 den Wert assertion.sub ein.
  7. Klicken Sie auf Speichern.

  8. Notieren Sie sich Folgendes:

    • Pool-ID
    • Anbieter-ID

    Sie benötigen diese IDs, wenn Sie den Clientschlüssel konfigurieren.

Details zur Google-Metadatenserverinstanz abrufen

So rufen Sie die Details zur Google-Metadatenserverinstanz ab, die Sie zum Konfigurieren der Identitätsföderation von Arbeitslasten benötigen:

  1. Führen Sie in der SAP-GUI den Transaktionscode /GOOG/SDK_IMG aus.

    Alternativ können Sie den Transaktionscode SPRO ausführen und dann auf SAP-Referenz-IMG klicken.

  2. Klicken Sie auf ABAP SDK for Google Cloud > Dienstprogramme > Bestimmte Metadatenwerte für die Google-Metadatenserverinstanz abrufen.
  3. Wählen Sie die Optionen aus, die für Sie zutreffen:
    • Numerische Projekt-ID
    • E-Mail-Adresse des Standarddienstkontos
  4. Klicken Sie auf Ausführen, um die Details aufzurufen.
  5. Notieren Sie sich die Details. Sie benötigen sie, wenn Sie die Identitätsföderation von Arbeitslasten in der Google Cloud Console konfigurieren.

Dienstkonto erstellen

Erstellen Sie in der Google Cloud Console ein IAM-Dienstkonto. Dieses Dienstkonto muss ein Hauptkonto in dem Google Cloud-Projekt sein, das dieGoogle Cloud APIs enthält, die Sie mit dem SDK nutzen möchten.

  1. Wählen Sie in der Google Cloud Console das Projekt aus, in dem Sie das Dienstkonto erstellen möchten.

    • Wenn Sie das Dienstkonto in dem Projekt erstellen, in dem sich die Google Cloud APIs befinden, wird das Dienstkonto dem Projekt automatisch als Hauptkonto hinzugefügt.

    • Wenn Sie das Dienstkonto in einem anderen Projekt als dem Projekt erstellen, in dem dieGoogle Cloud APIs aktiviert sind, müssen Sie das Dienstkonto diesem Projekt in einem zusätzlichen Schritt hinzufügen. Weitere Informationen finden Sie unter Dienstkonto zum Google Cloud-Projekt hinzufügen.

  2. Erstellen Sie ein Dienstkonto für die Authentifizierung und Autorisierung zum Zugriff auf Google Cloud APIs.

    Zur Seite „Dienstkonten“

    Informationen zum Erstellen eines Dienstkontos finden Sie unter Dienstkonto erstellen.

  3. Gewähren Sie dem Dienstkonto in der Google Cloud Console die erforderlichen IAM-Rollen, um auf die API-Funktionalität zuzugreifen. Um die Rollenanforderung für Google Cloud APIs zu verstehen, lesen Sie die einzelne API-Dokumentation und folgen Sie dem Prinzip der geringsten Berechtigung. Weitere Informationen zu API-spezifischen vordefinierten Rollen finden Sie in der Referenz zu einfachen und vordefinierten IAM-Rollen.

  4. Wenn Sie das Dienstkonto in einem anderen Projekt als dem Projekt erstellt haben, das die Google Cloud APIs enthält, die Sie mit dem SDK nutzen möchten, notieren Sie sich den Namen des Dienstkontos. Sie geben den Namen an, wenn Sie das Dienstkonto diesem Projekt hinzufügen.

Dienstkonto zum Google Cloud-Projekt hinzufügen

Wenn Sie das Dienstkonto für ABAP SDK for Google Cloud in einem anderen Projekt als dem Projekt erstellt haben, das die Google Cloud APIs enthält, die Sie mit dem SDK verwenden möchten, müssen Sie das Dienstkonto dem Google Cloud-Projekt hinzufügen, das die Google Cloud APIs enthält.

Wenn Sie das Dienstkonto in dem Projekt erstellt haben, in dem sich dieGoogle Cloud APIs befinden, können Sie diesen Schritt überspringen.

Führen Sie die folgenden Schritte aus, um dem Google Cloud-Projekt, das die Google Cloud APIs enthält, ein vorhandenes Dienstkonto hinzuzufügen:

  1. Öffnen Sie in der Google Cloud Console die Seite der IAM-Berechtigungen.

    Zu "IAM-Berechtigungen"

  2. Prüfen Sie, ob der Name des Projekts, in dem die ZielGoogle Cloud APIs enthalten sind, oben auf der Seite angezeigt wird. Beispiel:

    Berechtigungen für das Projekt „PROJECT_NAME

    Ist das nicht der Fall, wechseln Sie das Projekt.

  3. Klicken Sie auf der Seite er IAM-Berechtigungen auf Zugriff erlauben.

  4. Führen Sie im angezeigten Dialogfeld Zugriff auf „PROJECT_NAME“ erlauben die folgenden Schritte aus:

    1. Geben Sie im Feld Neue Hauptkonten den Namen des Dienstkontos an.
    2. Geben Sie im Feld Rolle auswählen eine entsprechende Rolle an. Damit beispielsweise Pub/Sub Themen und Abos ändern und Nachrichten veröffentlichen und verarbeiten kann, geben Sie die Rolle Pub/Sub Editor (roles/pubsub.editor) an.

      Weitere Informationen zu API-spezifischen vordefinierten Rollen finden Sie in der Referenz zu einfachen und vordefinierten IAM-Rollen.

    3. Fügen Sie nach Bedarf weitere Rollen für die API-Nutzung hinzu. Wir empfehlen, das Prinzip der geringsten Berechtigung zu implementieren.

    4. Klicken Sie auf Speichern. Das Dienstkonto wird in der Liste der Projekthauptkonten auf der Seite IAM angezeigt.

Das Dienstkonto kann jetzt für den Zugriff auf Google Cloud APIs in diesem Projekt verwendet werden.

Dem Dienstkonto Zugriff auf den Pool der Identitätsföderation von Arbeitslasten gewähren

Um die Identität von Dienstkonten von föderierten Arbeitslasten zu übernehmen, weisen Sie dem Dienstkonto die Rolle Workload Identity-Nutzer (roles/iam.workloadIdentityUser) zu. Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff verwalten.

So gewähren Sie dem Dienstkonto Zugriff auf den Workload Identity Federation-Pool:

  1. Rufen Sie in der Google Cloud Console die Seite Workload Identity-Pools auf.

    Zu Workload Identity-Pools

  2. Wählen Sie den Workload Identity-Pool aus, den Sie im Abschnitt Identitätsföderation von Arbeitslasten konfigurieren erstellt haben.

  3. Klicken Sie auf Zugriff erlauben, um Zugriff auf den Workload Identity-Pool zu gewähren.

  4. Wählen Sie in der Liste Dienstkonto das Dienstkonto aus, das Zugriff auf Google Cloud -APIs hat. Wenn Sie mehrere Dienstkonten verwenden, fügen Sie sie hier alle hinzu.

  5. Wählen Sie im Feld Attributname die Option Subject aus.

  6. Geben Sie im Feld Attributwert die vom Metadatenserver abgerufene E-Mail-Adresse des Dienstkontos in doppelte Anführungszeichen ein. Beispiel: "svc-acct-compute@example-project-123456.iam.gserviceaccount.com".

    Informationen zum Abrufen der E-Mail-Adresse des Dienstkontos vom Metadatenserver finden Sie unter Details zur Instanz des Google-Metadatenservers abrufen.

  7. Klicken Sie im Dialogfeld Anwendung konfigurieren auf Schließen.

Clientschlüssel konfigurieren

  1. Führen Sie in der SAP-GUI den Transaktionscode /GOOG/SDK_IMG aus.

    Alternativ können Sie den Transaktionscode SPRO ausführen und dann auf SAP-Referenz-IMG klicken.

  2. Klicken Sie auf ABAP SDK for Google Cloud > Grundlegende Einstellungen > Clientschlüssel konfigurieren.
  3. Klicken Sie auf Neue Einträge.
  4. Geben Sie Werte für die folgenden Felder ein:

    Feld Beschreibung
    Google Cloud-Schlüsselname Geben Sie einen Namen für die Konfiguration des Clientschlüssels an.
    Name des Google Cloud-Dienstkontos Geben Sie den Namen des Dienstkontos im E-Mail-Adressformat an, das im Schritt Dienstkonto erstellen für den Zugriff auf Google Cloud APIs erstellt wurde. Beispiel: sap-example-svc-acct@example-project-123456.iam.gserviceaccount.com.
    Google Cloud-Bereich Geben Sie den API-Zugriffsbereich https://www.googleapis.com/auth/cloud-platform an.
    Google Cloud-Projekt-ID Geben Sie die ID des Google Cloud-Projekts an, in dem Sie den Workload Identity-Pool erstellt haben.
    Befehlsname Lassen Sie dieses Feld leer.
    Autorisierungsklasse Geben Sie die Authentifizierungsklasse an:
    • /GOOG/CL_AUTH_WIF_META_ACCESS: Er generiert von Google signierte OAuth-Tokens.
    • /GOOG/CL_AUTH_WIF_META_IDTOKEN: Generiert von Google signierte ID-Tokens.
    Token-Caching

    Das Flag, das bestimmt, ob die aus Google Cloud abgerufenen Zugriffstoken im Cache gespeichert werden.

    Wir empfehlen, das Token-Caching zu aktivieren, nachdem Sie Ihre Verbindung zu Google Cloudkonfiguriert und getestet haben.

    Sekunden bis Tokenaktualisierung Lassen Sie dieses Feld leer.
    Autorisierungsparameter 1 Geben Sie die Workload Identity-Pool-ID an.
    Autorisierungsparameter 2 Geben Sie die ID des Workload Identity-Anbieters an.
  5. Speichern Sie den Eintrag.

Workload Identity-Föderation mit externen IdPs

Sie können die Workload Identity-Föderation mit externen IdPs wie Amazon Web Services (AWS) oder mit einem beliebigen anderen Identitätsanbieter nutzen, der OpenID Connect (OIDC) unterstützt, z. B. Microsoft Azure oder SAML 2.0.

Für die Authentifizierung mit Tokens über Identitätsföderation von Arbeitslasten sind die folgenden allgemeinen Konfigurationsschritte erforderlich:

  1. Externen IdP vorbereiten.
  2. Konfigurieren Sie die Identitätsföderation von Arbeitslasten in Google Cloud.
  3. Erstellen Sie ein Dienstkonto in Google Cloud.
  4. Erlauben Sie in Google Cloud, dass die externe Arbeitslast die Identität des Dienstkontos übernehmen kann.
  5. Implementieren Sie im ABAP SDK for Google Cloud ABAP-Code, um Sicherheitstokens von Ihrem IdP abzurufen.
  6. Konfigurieren Sie den Clientschlüssel im ABAP SDK for Google Cloud.

Die Identitätsföderation von Arbeitslasten wird nicht von allen Google Cloud Produkten unterstützt. Sehen Sie sich vor dem Einrichten der Authentifizierung mit Identitätsföderation von Arbeitslasten die Liste der unterstützten Produkte und Einschränkungen an. Weitere Informationen finden Sie unter Mitarbeiteridentitätsföderation: Unterstützte Produkte und Einschränkungen.

Externen IdP vorbereiten

Sie müssen Ihren IdP so vorbereiten, dass Ihre SAP-Arbeitslast Anmeldedaten abrufen kann, die gegen ein Google OAuth 2.0-Sicherheitstoken ausgetauscht werden können.

Führen Sie die folgenden Schritte je nach IdP aus, um Ihren externen IdP vorzubereiten:

Identitätsföderation von Arbeitslasten konfigurieren

Konfigurieren Sie in Google Cloudden Workload Identity-Pool und die Anbieter.

Sie konfigurieren einen Identitätspool, also eine Entität, mit der Sie externe Identitäten verwalten können. Außerdem konfigurieren Sie einen Workload Identity-Poolanbieter, der eine Entität ist, die eine Beziehung zwischen Google Cloudund Ihrem IdP beschreibt.

Führen Sie zum Konfigurieren der Identitätsföderation von Arbeitslasten die folgenden Schritte je nach externem IdP aus:

Notieren Sie sich Folgendes:

  • Projektnummer: die Projektnummer des Google Cloud-Projekts, in dem Sie den Workload Identity-Pool erstellt haben.
  • Pool-ID: Eine eindeutige ID, die den Workload Identity-Pool identifiziert.
  • Anbieter-ID: Eine ID, die den Anbieter des Workload Identity-Pools identifiziert.

Sie benötigen sie für die Konfiguration des ABAP SDK-Clientschlüssels.

Dienstkonto erstellen

Erstellen Sie in der Google Cloud Console ein dediziertes IAM-Dienstkonto für den Zugriff auf Google Cloud APIs. Dieses Dienstkonto muss ein Hauptkonto in dem Google Cloud-Projekt sein, das dieGoogle Cloud APIs enthält, die Sie mit dem SDK nutzen möchten.

  1. Aktivieren Sie in der Google Cloud Console die IAM Service Account Credentials API, die Security Token Service API und alle anderen unterstützten APIs, auf Sie mit dem SDK zugreifen möchten.

    Zur API-Bibliothek

    Informationen zum Aktivieren von APIs Google Cloud finden Sie unter APIs aktivieren.

  2. Erstellen Sie ein Dienstkonto, das die Arbeitslast darstellt.

  3. Gewähren Sie dem Dienstkonto die erforderlichen IAM-Rollen, um auf die API-Funktionen zuzugreifen. Um die Rollenanforderung für Google Cloud APIs zu verstehen, lesen Sie die einzelne API-Dokumentation und folgen Sie dem Prinzip der geringsten Berechtigung. Weitere Informationen zu API-spezifischen vordefinierten Rollen finden Sie unter IAM-Rollen für APIs finden Google Cloud .

Externer Arbeitslast erlauben, die Identität des Dienstkontos zu übernehmen

Führen Sie die folgenden Schritte je nach externem IdP aus, damit die externe Arbeitslast die Identität des Dienstkontos übernehmen kann:

ABAP-Code implementieren, um Sicherheitstoken von Ihrem IdP abzurufen

Das ABAP SDK for Google Cloud bietet eine abstrakte Klasse /GOOG/CL_AUTH_WIF_BASE mit der Logik zum Abrufen von OAuth 2.0-Sicherheitstokens aus dem Security Token Service und OAuth 2.0-Zugriffstokens aus der IAM Service Account Credentials API. Als Entwickler müssen Sie in Ihrem Namespace eine untergeordnete Klasse erstellen, die von der abstrakten Klasse /GOOG/CL_AUTH_WIF_BASE übernimmt.

Zum Aufrufen von Cloud Run-Funktionen aus dem ABAP SDK for Google Cloud mithilfe der Identitätsföderation von Arbeitslasten bietet das SDK eine weitere abstrakte Klasse /GOOG/CL_AUTH_WIF_ID_TOKEN. Wenn Sie die Authentifizierung mithilfe der Identitätsföderation von Arbeitslasten einrichten, müssen Sie in Ihrem Namespace eine weitere untergeordnete Klasse erstellen, die von der abstrakten Klasse /GOOG/CL_AUTH_WIF_ID_TOKEN übernimmt. Sie geben diese untergeordnete Klasse im Feld Autorisierungsklasse an, während Sie den Clientschlüssel zum Aufrufen von Cloud Run-Funktionen konfigurieren.

Implementieren Sie die Methode GET_EXT_IDP_TOKEN in der untergeordneten Klasse und schreiben Sie die Logik, um das Sicherheitstoken von Ihrem IdP abzurufen. Füllen Sie die folgenden Felder aus:

  • CV_TOKEN ist das von Ihrem IdP abgerufene Token im Format string.
  • CV_TOKEN_TYPE ist der Typ des Sicherheitstokens, das von Ihrem IdP abgerufen wurde. Folgende Tokentypen werden unterstützt:
    • urn:ietf:params:oauth:token-type:jwt
    • urn:ietf:params:oauth:token-type:id_token
    • urn:ietf:params:aws:token-type:aws4_request
    • urn:ietf:params:oauth:token-type:access_token
    • urn:ietf:params:oauth:token-type:saml2

Die in CV_TOKEN und CV_TOKEN_TYPE eingegebenen Werte werden dann von Methoden der abstrakten Klasse /GOOG/CL_AUTH_WIF_BASE verwendet, um das in den API-Aufrufen verwendet, endgültige OAuth 2.0-Token auszutauschen und abzurufen.

Das folgende Beispiel zeigt die Beispielimplementierungen der Methode GET_EXT_IDP_TOKEN für andere Cloud-Anbieter wie AWS und Azure.

AWS

class ZCL_AUTH_WIF_AWS definition
  public
  inheriting from /GOOG/CL_AUTH_WIF_BASE
  final
  create public .

public section.

  types:
    BEGIN OF t_header_field,
      key type string,
      value TYPE string,
    END OF t_header_field .
  types:
    tt_header_field type STANDARD TABLE OF t_header_field WITH DEFAULT KEY .
  types:
    BEGIN OF t_token_request,
     url type string,
     method type string,
     headers type tt_header_field,
   END OF t_token_request .
protected section.

  methods GET_EXT_IDP_TOKEN
    redefinition .
private section.
ENDCLASS.



CLASS ZCL_AUTH_WIF_AWS IMPLEMENTATION.


METHOD get_ext_idp_token.
**********************************************************************
*  Copyright 2024 Google LLC                                         *
*                                                                    *
*  Licensed under the Apache License, Version 2.0 (the "License");   *
*  you may not use this file except in compliance with the License.  *
*  You may obtain a copy of the License at                           *
*      https://www.apache.org/licenses/LICENSE-2.0                   *
*  Unless required by applicable law or agreed to in writing,        *
*  software distributed under the License is distributed on an       *
*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,      *
*  either express or implied.                                        *
*  See the License for the specific language governing permissions   *
*  and limitations under the License.                                *
**********************************************************************

  DATA: ls_key       TYPE /goog/client_key.

  /goog/cl_utility=>get_client_key( EXPORTING iv_keyname    = iv_keyname
                                        IMPORTING es_client_key = ls_key ).


  DATA: lv_awsdate TYPE string.

  DATA: lv_date         TYPE dats,
        lv_time         TYPE tims,
        lv_timestamp    TYPE timestampl,
        lv_tz_utc       TYPE timezone VALUE 'UTC',
        lv_awsts        TYPE string,
        lv_timechar(32) TYPE c.

  GET TIME STAMP FIELD lv_timestamp.

  CONVERT TIME STAMP lv_timestamp TIME ZONE lv_tz_utc INTO DATE lv_date TIME lv_time.
  MOVE lv_timestamp TO lv_timechar.
  CONDENSE lv_timechar.

  lv_awsdate = lv_date(4) &&
               lv_date+4(2) &&
               lv_date+6(2) &&
               'T' &&
               lv_time(2) &&
               lv_time+2(2) &&
               lv_time+4(2) &&
               'Z'.

  TRANSLATE lv_awsdate TO UPPER CASE.

  DATA: lv_lf TYPE string.
  DATA: lv_secret_key TYPE string.
  DATA: lv_accesskey TYPE string.
  DATA: lv_datepart TYPE string.
  DATA: lv_service TYPE string.
  DATA: lv_method TYPE string.

  lv_lf = cl_abap_char_utilities=>newline.
  lv_accesskey = '<Populate AWS Access Key>'.
  lv_secret_key = '<Populate AWS Secret Access Key>'.
  lv_datepart = lv_awsdate(8).
  lv_service = 'sts'.
  lv_method = 'GET'.


  DATA: lv_canonical_query_params TYPE string.
  DATA: lv_host TYPE string.
  DATA: lv_region TYPE string.
  DATA: lv_canonical_resource_path TYPE string.

  lv_canonical_query_params = 'Action=GetCallerIdentity&Version=2011-06-15'.
  lv_host = 'sts.amazonaws.com'.
  lv_region = '<Populate your AWS Region>'.   "Example: 'us-east-1'
  lv_canonical_resource_path = '/'.

  DATA: lv_canonical_header_names TYPE string.
  DATA: lv_canonical_headers TYPE string.

  lv_canonical_header_names = 'host;x-amz-date'.
  lv_canonical_headers = 'host:' && lv_host && lv_lf && 'x-amz-date:' && lv_awsdate && lv_lf.

  DATA: lv_canonical_request TYPE string.

  CONCATENATE lv_method lv_lf
              lv_canonical_resource_path lv_lf
              lv_canonical_query_params lv_lf
              lv_canonical_headers lv_lf
              lv_canonical_header_names
              INTO lv_canonical_request.

  DATA: lv_canonical_request_hash TYPE string.

  TRY.
      cl_abap_message_digest=>calculate_hash_for_char(
       EXPORTING
         if_algorithm = 'SHA-256'
         if_data = lv_canonical_request
       IMPORTING
         ef_hashstring = lv_canonical_request_hash ).
    CATCH cx_abap_message_digest.
      "Handle error
      RETURN.
  ENDTRY.

  TRANSLATE lv_canonical_request_hash TO LOWER CASE.

  DATA: lv_algorithm TYPE string.

  lv_algorithm = 'AWS4-HMAC-SHA256'.

  DATA: lv_credential_scope TYPE string.

  CONCATENATE lv_datepart '/' lv_region '/' lv_service '/' 'aws4_request' INTO lv_credential_scope.

  DATA: lv_string_to_sign TYPE string.

  CONCATENATE lv_algorithm lv_lf
              lv_awsdate lv_lf
              lv_credential_scope lv_lf
              lv_canonical_request_hash
              INTO lv_string_to_sign.

  DATA: lv_awskey TYPE string.

  CONCATENATE 'AWS4' lv_secret_key INTO lv_awskey.

  DATA: lv_ksecret TYPE xstring.

  TRY.
      lv_ksecret = cl_abap_hmac=>string_to_xstring( lv_awskey ).
    CATCH cx_abap_message_digest .
      "Handle error
      RETURN.
  ENDTRY.

  DATA: lv_kdate  TYPE xstring.
  TRY.
      cl_abap_hmac=>calculate_hmac_for_char(
        EXPORTING
           if_algorithm = 'SHA256'
           if_key = lv_ksecret
           if_data = lv_datepart
        IMPORTING
           ef_hmacxstring = lv_kdate ).
    CATCH cx_abap_message_digest. "
      "Handle error
      RETURN.
  ENDTRY.

  DATA: lv_kregion TYPE xstring.
  TRY.
      cl_abap_hmac=>calculate_hmac_for_char(
        EXPORTING
           if_algorithm = 'SHA256'
           if_key = lv_kdate
           if_data = lv_region
        IMPORTING
             ef_hmacxstring = lv_kregion ).
    CATCH cx_abap_message_digest.
      "Handle error
      RETURN.
  ENDTRY.

  DATA: lv_kservice TYPE xstring.
  TRY.
      cl_abap_hmac=>calculate_hmac_for_char(
         EXPORTING
           if_algorithm = 'SHA256'
           if_key = lv_kregion
           if_data = lv_service
           IMPORTING
             ef_hmacxstring = lv_kservice ).
    CATCH cx_abap_message_digest.
      "Handle error
      RETURN.
  ENDTRY.

  DATA: lv_ksigningkey TYPE xstring.
  TRY.
      cl_abap_hmac=>calculate_hmac_for_char(
         EXPORTING
           if_algorithm = 'SHA256'
           if_key = lv_kservice
           if_data = 'aws4_request'
         IMPORTING
             ef_hmacxstring = lv_ksigningkey ).
    CATCH cx_abap_message_digest.
      "Handle error
      RETURN.
  ENDTRY.

  DATA: lv_stringtosign TYPE string.

  lv_stringtosign = 'AWS4-HMAC-SHA256' && lv_lf &&
                   lv_awsdate && lv_lf &&
                   lv_datepart && '/' &&
                   lv_region && '/' &&
                   lv_service && '/aws4_request' && lv_lf &&
                   lv_canonical_request_hash.

  DATA: lv_ssignature TYPE string.

  TRY.
      cl_abap_hmac=>calculate_hmac_for_char(
         EXPORTING
           if_algorithm = 'SHA256'
           if_key = lv_ksigningkey
           if_data = lv_stringtosign
         IMPORTING
           ef_hmacstring = lv_ssignature ).
    CATCH cx_abap_message_digest.
      "Handle error
      RETURN.
  ENDTRY.

  TRANSLATE lv_ssignature TO LOWER CASE.

  DATA: lv_authorization_header TYPE string.

  lv_authorization_header = 'AWS4-HMAC-SHA256 Credential=' &&
                            lv_accesskey && '/' &&
                            lv_credential_scope &&
                            ', SignedHeaders=' &&
                            lv_canonical_header_names &&
                            ', Signature=' &&
                            lv_ssignature.

  DATA: ls_token_request TYPE t_token_request.

  ls_token_request-url = 'https://sts.amazonaws.com?Action=GetCallerIdentity&Version=2011-06-15'.
  ls_token_request-method = 'POST'.

  DATA: ls_header_field TYPE t_header_field.
  ls_header_field-key = 'Authorization'.
  ls_header_field-value = lv_authorization_header.
  APPEND ls_header_field TO ls_token_request-headers.

  CLEAR: ls_header_field.
  ls_header_field-key = 'host'.
  ls_header_field-value = 'sts.amazonaws.com'.
  APPEND ls_header_field TO ls_token_request-headers.

  CLEAR: ls_header_field.
  ls_header_field-key = 'x-amz-date'.
  ls_header_field-value = lv_awsdate.
  APPEND ls_header_field TO ls_token_request-headers.

  CLEAR: ls_header_field.
  ls_header_field-key = 'x-goog-cloud-target-resource'.
  ls_header_field-value = '//iam.googleapis.com/projects/' &&
                               ls_key-project_id &&
                               '/locations/global/workloadIdentityPools/' &&
                               ls_key-auth_param1 &&
                               '/providers/' &&
                               ls_key-auth_param2.
  APPEND ls_header_field TO ls_token_request-headers.

  cv_token = /ui2/cl_json=>serialize(  ls_token_request ).
  cv_token_type = 'urn:ietf:params:aws:token-type:aws4_request'.

ENDMETHOD.
ENDCLASS.

Azure

class ZCL_AUTH_WIF_AZURE definition
  public
  inheriting from /GOOG/CL_AUTH_WIF_BASE
  final
  create public .

public section.
protected section.

  methods GET_EXT_IDP_TOKEN
    redefinition .
private section.
ENDCLASS.



CLASS ZCL_AUTH_WIF_AZURE IMPLEMENTATION.


  METHOD GET_EXT_IDP_TOKEN.
**********************************************************************
*  Copyright 2024 Google LLC                                         *
*                                                                    *
*  Licensed under the Apache License, Version 2.0 (the "License");   *
*  you may not use this file except in compliance with the License.  *
*  You may obtain a copy of the License at                           *
*      https://www.apache.org/licenses/LICENSE-2.0                   *
*  Unless required by applicable law or agreed to in writing,        *
*  software distributed under the License is distributed on an       *
*  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,      *
*  either express or implied.                                        *
*  See the License for the specific language governing permissions   *
*  and limitations under the License.                                *
**********************************************************************

    TYPES:
      BEGIN OF t_azure_resp,
        access_token TYPE string,
      END OF t_azure_resp.

    DATA: lo_client TYPE REF TO if_http_client.

    DATA: lv_url type string.
    lv_url = 'http://169.254.169.254/metadata/identity/oauth2/token?resource=<APP_ID_URI>&api-version=2018-02-01'.
    "Replace <APP_ID_URI> with the value of Application ID URI of the application that you've configured for workload identity federation.

    cl_http_client=>create_by_url(
       EXPORTING
         url                        = lv_url
       IMPORTING
         client                     = lo_client
       EXCEPTIONS
         argument_not_found         = 1
         plugin_not_active          = 2
         internal_error             = 3
         pse_not_found              = 4
         pse_not_distrib            = 5
         pse_errors                 = 6
         oa2c_set_token_error       = 7
         oa2c_missing_authorization = 8
         oa2c_invalid_config        = 9
         oa2c_invalid_parameters    = 10
         oa2c_invalid_scope         = 11
         oa2c_invalid_grant         = 12
         OTHERS                     = 13 ).

    IF sy-subrc <> 0.
      RETURN.
    ENDIF.

    lo_client->request->set_method( 'GET' ).
    lo_client->request->set_header_field( name = 'Metadata' value = 'true' ).

    lo_client->send(
      EXCEPTIONS
        http_communication_failure = 1
        http_invalid_state         = 2
        http_processing_failed     = 3
        http_invalid_timeout       = 4
        OTHERS                     = 5 ).

    lo_client->propertytype_logon_popup = lo_client->co_disabled.

    lo_client->receive(
      EXCEPTIONS
      http_communication_failure = 1
      http_invalid_state         = 2
      http_processing_failed     = 3 ).

    DATA: lv_json TYPE string.

    lv_json = lo_client->response->get_cdata( ).

    DATA: ls_azure_resp TYPE t_azure_resp.

    /goog/cl_json=>deserialize(
      EXPORTING
        json             = lv_json
      CHANGING
        data             = ls_azure_resp ).
    cv_token = ls_azure_resp-access_token.
    cv_token_type = 'urn:ietf:params:oauth:token-type:jwt'.

  ENDMETHOD.
ENDCLASS.

Clientschlüssel konfigurieren

  1. Führen Sie in der SAP-GUI den Transaktionscode /GOOG/SDK_IMG aus.

    Alternativ können Sie den Transaktionscode SPRO ausführen und dann auf SAP-Referenz-IMG klicken.

  2. Klicken Sie auf ABAP SDK for Google Cloud > Grundlegende Einstellungen > Clientschlüssel konfigurieren.
  3. Klicken Sie auf Neue Einträge.
  4. Geben Sie Werte für die folgenden Felder ein:

    Feld Beschreibung
    Google Cloud-Schlüsselname Geben Sie einen Namen für die Konfiguration des Clientschlüssels an.
    Name des Google Cloud-Dienstkontos Geben Sie den Namen des Dienstkontos im E-Mail-Adressformat an, das im Schritt Dienstkonto erstellen für den Zugriff auf Google Cloud APIs erstellt wurde. Beispiel: sap-example-svc-acct@example-project-123456.iam.gserviceaccount.com.
    Google Cloud-Bereich Geben Sie den API-Zugriffsbereich https://www.googleapis.com/auth/cloud-platform an.
    Google Cloud-Projekt-ID Geben Sie die ID des Google Cloud-Projekts an, in dem Sie den Workload Identity-Pool erstellt haben.
    Befehlsname Lassen Sie dieses Feld leer.
    Autorisierungsklasse Geben Sie die untergeordnete Klasse an, die die Implementierung der Klasse /GOOG/CL_AUTH_WIF_BASE enthält. Weitere Informationen finden Sie unter ABAP-Code zum Abrufen von Sicherheitstokens von Ihrem IdP implementieren.
    Token-Caching

    Das Flag, das bestimmt, ob die aus Google Cloud abgerufenen Zugriffstoken im Cache gespeichert werden.

    Wir empfehlen, das Token-Caching zu aktivieren, nachdem Sie Ihre Verbindung zu Google Cloudkonfiguriert und getestet haben.

    Sekunden bis Tokenaktualisierung Lassen Sie dieses Feld leer.
    Autorisierungsparameter 1 Geben Sie die Workload Identity-Pool-ID an.
    Autorisierungsparameter 2 Geben Sie die ID des Workload Identity-Anbieters an.
  5. Speichern Sie den Eintrag.

Support anfordern

Wenn Sie Hilfe bei der Behebung von Problemen mit dem ABAP SDK für Google Cloud benötigen, gehen Sie so vor: