Workload Identity 連携によるトークンを使用した認証

このドキュメントでは、Workload Identity 連携でトークンを使用して Google Cloudで認証を行う方法について説明します。Workload Identity 連携を使用すると、サービス アカウント キーを使用せずに、オンプレミスまたはマルチクラウドの SAP ワークロードに Google Cloudリソースへのアクセス権を付与できます。

Workload Identity 連携は、OAuth 2.0 トークン交換の仕様に従います。IdP からセキュリティ トークン サービスに認証情報を提供します。このサービスは、認証情報の ID を検証し、連携アクセス トークンを返します。この連携アクセス トークンは、サポートされているサービスで直接使用できます。また、このトークンを使用してサービス アカウントの権限を借用し、有効期間の短いアクセス トークンを取得することもできます。有効期間の短いアクセス トークンを使用すると、サービス アカウントがアクセスできる Google Cloud API を呼び出すことができます。

Workload Identity 連携は、メタデータ サーバーまたは外部 ID プロバイダ(IdP)で使用できます。

VM メタデータを使用した Workload Identity 連携

Google Cloud でホストされている SAP システムが SAP によって管理されている場合は、Workload Identity 連携を使用すると、SAP システムから他のGoogle Cloud プロジェクトのリソースに安全にアクセスできます。Workload Identity 連携を使用すると、SAP システムは VM メタデータを使用して他の Google Cloud プロジェクトで認証できます。サービス アカウント キーを管理する必要がないため、セキュリティが強化され、認証が簡素化されます。

おおまかな構成手順は次のとおりです。

  1. Google Cloudで、Workload Identity 連携を構成します。
  2. Google Cloudで、サービス アカウントを作成します。
  3. Google Cloudで、サービス アカウントに Workload Identity 連携プールへのアクセス権を付与します。
  4. ABAP SDK for Google Cloud でクライアント キーを構成します。

Workload Identity 連携を構成する

Workload Identity 連携の構成に必要な権限を取得するには、プロジェクトに対して次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与の詳細については、アクセスの管理をご覧ください。

Workload Identity 連携を構成するには、次の操作を行います。

  1. Google Cloud コンソールで、[新しいワークロード プロバイダとプール] ページに移動します。

    [新しいワークロード プロバイダとプール] に移動

  2. [ID プールを作成する] セクションで、次のフィールドに値を入力します。

    • 名前: プールの名前。この名前はプール ID としても使用されます。プール ID を後で変更することはできません。
    • 説明: プールの目的を説明するテキスト。
  3. [続行] をクリックします。

  4. [プールにプロバイダを追加する] で、メタデータ サーバーをプロバイダとして追加します。

    1. [プロバイダの選択] フィールドで、[OpenID Connect(OIDC)] を選択します。
    2. 次のプロバイダの詳細を入力します。

      • プロバイダ名: プロバイダの名前を入力します。
      • 発行元(URL): メタデータ サーバー トークンの URL https://accounts.google.com を入力します。
      • オーディエンス: [Allowed audience] を選択し、アクセスする必要がある Google Cloud プロジェクトの Google Cloud プロジェクト番号を入力します。プロジェクト番号の取得方法については、Google メタデータ サーバー インスタンスの詳細を収集するをご覧ください。
  5. [続行] をクリックします。

  6. [プロバイダの属性を構成する] で、次の操作を行います。

    • [Google 1] フィールドの値が google.subject であることを確認します。
    • [OIDC 1] フィールドに「assertion.sub」と入力します。
  7. [保存] をクリックします。

  8. 次の情報をメモします。

    • プール ID
    • プロバイダ ID

    これらの ID は、クライアント キーを構成するときに必要になります。

Google メタデータ サーバー インスタンスの詳細を収集する

Workload Identity 連携の構成に必要な Google メタデータ サーバー インスタンスの詳細を取得するには、次の操作を行います。

  1. SAP GUI で、トランザクション コード /GOOG/SDK_IMG を実行します。

    または、トランザクション コード SPRO を実行して、[SAP Reference IMG] をクリックします。

  2. [ABAP SDK for Google Cloud] > [Utilities] > [Get specific metadata values for Google Metadata Server Instance] をクリックします。
  3. 必要に応じてオプションを選択します。
    • プロジェクト数値 ID
    • デフォルト サービス アカウントのメールアドレス
  4. [Execute] をクリックして詳細情報を表示します。
  5. 詳細をメモします。これらの値は、 Google Cloud コンソールで Workload Identity 連携を構成するときに必要になります。

サービス アカウントを作成する

Google Cloud コンソールで、IAM サービス アカウントを作成します。このサービス アカウントは、SDK で使用予定のGoogle Cloud API を含む Google Cloud プロジェクトのプリンシパルである必要があります。

  1. Google Cloud コンソールで、サービス アカウントを作成するプロジェクトを選択します。

    • Google Cloud API を含む同じプロジェクトにサービス アカウントを作成する場合、サービス アカウントは自動的にプリンシパルとしてプロジェクトに追加されます。

    • Google Cloud API が有効になっているプロジェクト以外のプロジェクトにサービス アカウントを作成する場合は、追加のステップで対象のプロジェクトにサービス アカウントを追加する必要があります。詳細については、サービス アカウントを Google Cloud プロジェクトに追加するをご覧ください。

  2. Google Cloud API へのアクセスの認証と認可に使用するサービス アカウントを作成します。

    [サービス アカウント] に移動

    サービス アカウントの作成方法については、サービス アカウントを作成するをご覧ください。

  3. Google Cloud コンソールで、API 機能にアクセスするために必要な IAM ロールをサービス アカウントに付与します。 Google Cloud API のロールの要件については、該当する API のドキュメントをご覧ください。また、最小権限の原則に従ってください。API 固有の事前定義ロールの詳細については、IAM の基本ロールと事前定義ロールのリファレンスをご覧ください。

  4. SDK で使用予定の Google Cloud API を含むプロジェクトとは別のプロジェクトにサービス アカウントを作成した場合は、サービス アカウントの名前をメモします。この名前は、そのプロジェクトにサービス アカウントを追加するときに指定します。

サービス アカウントを Google Cloud プロジェクトに追加する

SDK で使用予定の Google Cloud API を含むプロジェクト以外のプロジェクトに、ABAP SDK for Google Cloud のサービス アカウントを作成した場合は、 Google Cloud API を含む Google Cloud プロジェクトにサービス アカウントを追加する必要があります。

Google Cloud API を含むプロジェクトにサービス アカウントを作成した場合は、このステップをスキップできます。

Google Cloud API を含む Google Cloud プロジェクトに既存のサービス アカウントを追加するには、次の操作を行います。

  1. Google Cloud コンソールで IAM の [権限] ページに移動します。

    IAM の [権限] に移動

  2. ターゲットのGoogle Cloud API を含むプロジェクトの名前がページの上部付近に表示されていることを確認します。例:

    プロジェクト PROJECT_NAME の権限

    そうでない場合は、プロジェクトを切り替えます。

  3. IAM の [権限] ページで、[アクセス権を付与] をクリックします。

  4. 表示された [PROJECT_NAME」へのアクセス権を付与します] ダイアログで、次の操作を行います。

    1. [新しいプリンシパル] フィールドに、サービス アカウントの名前を指定します。
    2. [ロールを選択] フィールドで、関連するロールを指定します。たとえば、Pub/Sub でトピックとサブスクリプションを変更し、メッセージをパブリッシュして使用するには、Pub/Sub 編集者(roles/pubsub.editor)のロールを指定します。

      API 固有の事前定義ロールの詳細については、IAM の基本ロールと事前定義ロールのリファレンスをご覧ください。

    3. API の用途に応じて、さらに別のロールを追加します。最小権限の原則を実装することをおすすめします。

    4. [保存] をクリックします。サービス アカウントは、[IAM] ページのプロジェクト プリンシパルのリストに表示されます。

これで、サービス アカウントを使用して、このプロジェクトの Google Cloud API にアクセスできるようになりました。

サービス アカウントに Workload Identity 連携プールへのアクセス権を付与する

連携ワークロードからサービス アカウントの権限を借用するには、サービス アカウントに Workload Identity ユーザー(roles/iam.workloadIdentityUserを付与します。ロールの付与の詳細については、アクセスの管理をご覧ください。

サービス アカウントに Workload Identity 連携プールへのアクセス権を付与するには、次の操作を行います。

  1. Google Cloud コンソールで、[Workload Identity プール] ページに移動します。

    [Workload Identity プール] に移動

  2. Workload Identity 連携を構成するで作成した Workload Identity プールを選択します。

  3. 選択した Workload Identity プールへのアクセス権を付与するには、[ アクセスを許可] をクリックします。

  4. [サービス アカウント] リストで、 Google Cloud API にアクセスできるサービス アカウントを選択します。複数のサービス アカウントを使用する場合は、すべてここに追加します。

  5. [属性名] フィールドで [サブジェクト] を選択します。

  6. [属性値] フィールドに、メタデータ サーバーから取得したサービス アカウントのメールアドレスを二重引用符で囲んで入力します。例: "svc-acct-compute@example-project-123456.iam.gserviceaccount.com"

    メタデータ サーバーからサービス アカウントのメールアドレスを取得する方法については、Google メタデータ サーバー インスタンスの詳細を収集するをご覧ください。

  7. 表示された [アプリケーションの構成] ダイアログで、[閉じる] をクリックします。

クライアント キーを構成する

  1. SAP GUI で、トランザクション コード /GOOG/SDK_IMG を実行します。

    または、トランザクション コード SPRO を実行して、[SAP Reference IMG] をクリックします。

  2. [ABAP SDK for Google Cloud] > [Basic Settings] > [Configure Client Key] をクリックします。
  3. [New Entries] をクリックします。
  4. 次のフィールドに値を入力します。

    フィールド 説明
    Google Cloud キー名 クライアント キー構成の名前を指定します。
    Google Cloud サービス アカウント名 サービス アカウントを作成するで Google Cloud API にアクセスするために作成したサービス アカウントの名前(メールアドレス)を指定します。例: sap-example-svc-acct@example-project-123456.iam.gserviceaccount.com
    Google Cloud のスコープ API アクセス スコープ https://www.googleapis.com/auth/cloud-platform を指定します。
    Google Cloud プロジェクト ID Workload Identity プールを作成した Google Cloud プロジェクトの ID を指定します。
    コマンド名 このフィールドは空白のままにしておきます。
    認可クラス 必要に応じて認証クラスを指定します。
    • /GOOG/CL_AUTH_WIF_META_ACCESS: Google 署名付き OAuth トークンを生成します。
    • /GOOG/CL_AUTH_WIF_META_IDTOKEN: Google 署名付き ID トークンを生成します。
    トークンのキャッシュ保存

    Google Cloud から取得したアクセス トークンをキャッシュに保存するかどうかを決定するフラグ。

    Google Cloudへの接続を構成してテストしたら、トークンのキャッシュ保存を有効にすることをおすすめします。

    トークンの更新期限(秒) このフィールドは空白のままにしておきます。
    認可パラメータ 1 Workload Identity プールの ID を指定します。
    認可パラメータ 2 Workload Identity プロバイダ ID を指定します。
  5. エントリを保存します。

外部 IdP を使用した Workload Identity 連携

Workload Identity 連携は、アマゾン ウェブ サービス(AWS)などの外部 IdP や、OpenID Connect(OIDC)をサポートする任意の ID プロバイダ(IdP)(Microsoft Azure や SAML 2.0 など)で使用できます。

Workload Identity 連携によるトークン認証の場合、おおまかな構成手順は次のとおりです。

  1. 外部 IdP を準備します
  2. Google Cloudで、Workload Identity 連携を構成します。
  3. Google Cloudで、サービス アカウントを作成します。
  4. Google Cloudで、外部ワークロードにサービス アカウントの権限借用を許可します。
  5. ABAP SDK for Google Cloud で、IdP からセキュリティ トークンを取得する ABAP コードを実装します。
  6. ABAP SDK for Google Cloud でクライアント キーを構成します。

すべての Google Cloud プロダクトが Workload Identity 連携をサポートしているわけではありません。Workload Identity 連携を使用して認証を設定する前に、サポートされているプロダクトと制限事項を確認してください。詳細については、Workforce Identity 連携: サポート対象のプロダクトと制限事項をご覧ください。

外部 IdP を準備する

SAP ワークロードが Google OAuth 2.0 セキュリティ トークンと交換できる認証情報を取得できるように、IdP を準備する必要があります。

外部 IdP を準備するには、IdP に応じて次の操作を行います。

Workload Identity 連携を構成する

Google Cloudで、Workload Identity プールとプロバイダを構成します。

ID プールを構成します。ID プールは、外部 ID を管理できるエンティティです。また、Workload Identity プール プロバイダも構成します。これは、 Google Cloudと IdP の関係を記述するエンティティです。

Workload Identity 連携を構成するには、外部 IdP に応じて次の操作を行います。

次の情報をメモします。

  • プロジェクト番号: Workload Identity プールを作成した Google Cloud プロジェクトのプロジェクト番号。
  • プール ID: Workload Identity プールを識別する一意の ID。
  • プロバイダ ID: Workload Identity プール プロバイダを識別する ID。

これらの情報は、ABAP SDK クライアント キーの構成に必要です。

サービス アカウントを作成する

Google Cloud コンソールで、 Google Cloud API にアクセスするための専用の IAM サービス アカウントを作成します。このサービス アカウントは、SDK で使用予定のGoogle Cloud API を含む Google Cloud プロジェクトのプリンシパルである必要があります。

  1. Google Cloud コンソールで、IAM Service Account Credentials APISecurity Token Service API、SDK を使用してアクセスするその他のサポート対象の API を有効にします。

    API ライブラリに移動

    Google Cloud API を有効にする方法については、API の有効化をご覧ください。

  2. ワークロードを表すサービス アカウントを作成します。

  3. API 機能にアクセスするために必要な IAM ロールをサービス アカウントに付与します。 Google Cloud API のロールの要件については、該当する API のドキュメントをご覧ください。また、最小権限の原則に従ってください。API 固有の事前定義ロールの詳細については、 Google Cloud API の IAM ロールを確認するをご覧ください。

外部ワークロードにサービス アカウントの権限借用を許可する

外部ワークロードにサービス アカウントの権限借用を許可するには、外部 IdP に応じて次の操作を行います。

IdP からセキュリティ トークンを取得する ABAP コードを実装する

ABAP SDK for Google Cloud には、抽象クラス /GOOG/CL_AUTH_WIF_BASE が用意されています。このクラスには、Security Token Service から OAuth 2.0 セキュリティ トークンを取得するロジックと、IAM Service Account Credentials API から OAuth 2.0 アクセス トークンを取得するロジックが含まれています。デベロッパーは、抽象クラス /GOOG/CL_AUTH_WIF_BASE を継承する子クラスを名前空間に作成する必要があります。

Workload Identity 連携を使用して ABAP SDK for Google Cloud から Cloud Run functions を呼び出すには、SDK で提供される別の抽象クラス /GOOG/CL_AUTH_WIF_ID_TOKEN を使用します。Workload Identity 連携を使用して認証を設定する場合、抽象クラス /GOOG/CL_AUTH_WIF_ID_TOKEN を継承する子クラスを名前空間にもう 1 つ作成する必要があります。この子クラスは、Cloud Run 関数を呼び出すためのクライアント キーの構成時に [認可クラス] フィールドで指定します。

必ず、子クラスでメソッド GET_EXT_IDP_TOKEN を実装し、IdP からセキュリティ トークンを取得するロジックを記述してください。次のフィールドに入力します。

  • CV_TOKEN: IdP から取得したトークン(string 形式)。
  • CV_TOKEN_TYPE: IdP から取得したセキュリティ トークンのタイプ。サポートされているトークンタイプは次のとおりです。
    • 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

CV_TOKENCV_TOKEN_TYPE に入力された値は、抽象クラス /GOOG/CL_AUTH_WIF_BASE のメソッドで使用され、API 呼び出しで使用される最終的な OAuth 2.0 トークンを交換して取得します。

次の例は、AWS や Azure などの他のクラウド プロバイダ向けの GET_EXT_IDP_TOKEN メソッドの実装例を示しています。

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.

クライアント キーを構成する

  1. SAP GUI で、トランザクション コード /GOOG/SDK_IMG を実行します。

    または、トランザクション コード SPRO を実行して、[SAP Reference IMG] をクリックします。

  2. [ABAP SDK for Google Cloud] > [Basic Settings] > [Configure Client Key] をクリックします。
  3. [New Entries] をクリックします。
  4. 次のフィールドに値を入力します。

    フィールド 説明
    Google Cloud キー名 クライアント キー構成の名前を指定します。
    Google Cloud サービス アカウント名 サービス アカウントを作成するで Google Cloud API にアクセスするために作成したサービス アカウントの名前(メールアドレス)を指定します。例: sap-example-svc-acct@example-project-123456.iam.gserviceaccount.com
    Google Cloud のスコープ API アクセス スコープ https://www.googleapis.com/auth/cloud-platform を指定します。
    Google Cloud プロジェクト ID Workload Identity プールを作成した Google Cloud プロジェクトの ID を指定します。
    コマンド名 このフィールドは空白のままにしておきます。
    認可クラス 子クラスを指定します。このクラスには、クラス /GOOG/CL_AUTH_WIF_BASE の実装が含まれています。詳しくは、IdP からセキュリティ トークンを取得する ABAP コードを実装するをご覧ください。
    トークンのキャッシュ保存

    Google Cloud から取得したアクセス トークンをキャッシュに保存するかどうかを決定するフラグ。

    Google Cloudへの接続を構成してテストしたら、トークンのキャッシュ保存を有効にすることをおすすめします。

    トークンの更新期限(秒) このフィールドは空白のままにしておきます。
    認可パラメータ 1 Workload Identity プールの ID を指定します。
    認可パラメータ 2 Workload Identity プロバイダ ID を指定します。
  5. エントリを保存します。

サポートを受ける

ABAP SDK for Google Cloud の問題を解決するには、次の操作を行います。