Autenticar usando tokens por meio da federação de identidade da carga de trabalho

Este documento descreve como se autenticar no Google Cloud usando tokens pela federação de identidade da carga de trabalho. Com a federação de identidade da carga de trabalho, é possível conceder às cargas de trabalho SAP locais ou em várias nuvens acesso aos recursos do Google Cloud sem usar uma chave de conta de serviço.

A federação de identidade da carga de trabalho segue a especificação de troca de token do OAuth 2.0. Você fornece uma credencial do IdP ao Serviço de token de segurança, que verifica a identidade na credencial e, em seguida, retorna um token de acesso federado em troca. É possível usar esse token de acesso federado diretamente com serviços com suporte ou para imitar uma conta de serviço e receber um token de acesso de curta duração. Com o token de acesso de curta duração, é possível chamar qualquer API Google Cloud a que a conta de serviço tenha acesso.

É possível usar a federação de identidade da carga de trabalho com o servidor de metadados ou o provedor de identidade externo (IdP).

Federação de identidade da carga de trabalho com metadados de VM

Se o sistema SAP estiver hospedado no Google Cloud , mas for gerenciado pela SAP, use a federação de identidade da carga de trabalho para acessar com segurança os recursos em outros projetosGoogle Cloud do sistema SAP. A federação de identidade da carga de trabalho permite que o sistema SAP se autentique em outros projetos Google Cloud usando os metadados da VM. Isso elimina a necessidade de gerenciar chaves de conta de serviço, aumentando a segurança e simplificando a autenticação.

As etapas de configuração de nível alto são as seguintes:

  1. Em Google Cloud, configure a federação de identidade da carga de trabalho.
  2. Em Google Cloud, crie uma conta de serviço.
  3. Em Google Cloud, conceda à conta de serviço acesso ao pool de federação de identidade da carga de trabalho.
  4. No ABAP SDK for Google Cloud, configure a chave do cliente.

Configurar a federação de identidade da carga de trabalho

Para receber as permissões necessárias para configurar a federação de identidade da carga de trabalho, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto:

Para mais informações sobre como conceder papéis, consulte Gerenciar acesso.

Para configurar a federação de identidade da carga de trabalho, siga as etapas:

  1. No console do Google Cloud, acesse a página Novo provedor de carga de trabalho e pool.

    Acessar "Novo provedor de carga de trabalho" e "Pool"

  2. Na seção Criar um pool de identidades, insira um valor para os seguintes campos:

    • Nome: o nome do pool. O nome também é usado como o ID do pool. Não será possível alterar o ID do pool posteriormente.
    • Descrição: texto que descreve a finalidade do pool.
  3. Clique em Continuar.

  4. Em Adicionar um provedor ao pool, adicione o servidor de metadados como um provedor:

    1. No campo Selecionar um provedor, escolha OpenID Connect (OIDC).
    2. Digite os seguintes detalhes do provedor:

      • Em Nome do provedor, digite um nome para o provedor.
      • Issuer(URL): insira o URL do token do servidor de metadados, https://accounts.google.com.
      • Público-alvo: selecione Público-alvo permitido e insira o número do projeto do Google Cloud que você precisa acessar. Para saber como conseguir o número do projeto, consulte Reunir detalhes da instância do servidor de metadados do Google.
  5. Clique em Continuar.

  6. Em Configurar atributos do provedor, faça o seguinte:

    • No campo Google 1, verifique se o valor é google.subject.
    • No campo OIDC 1, digite assertion.sub.
  7. Clique em Salvar.

  8. Anote o seguinte:

    • ID do pool
    • Código do provedor

    Você vai precisar desses IDs ao configurar a chave do cliente.

Coletar detalhes da instância do servidor de metadados do Google

Para conferir os detalhes da instância do servidor de metadados do Google necessários para configurar a federação de identidade da carga de trabalho, siga estas etapas:

  1. Na GUI do SAP, execute o código de transação /GOOG/SDK_IMG.

    Como alternativa, execute o código da transação SPRO e clique em IMG de referência do SAP.

  2. Clique em ABAP SDK for Google Cloud > Utilities > Acessar valores de metadados específicos para a instância do servidor de metadados do Google.
  3. Selecione as opções adequadas:
    • ID do projeto numérico
    • E-mail da conta de serviço padrão
  4. Clique em Executar para ver os detalhes.
  5. Anote os detalhes. Você vai precisar deles ao configurar a federação de identidade da carga de trabalho no console do Google Cloud.

Criar uma conta de serviço

No console do Google Cloud, crie uma conta de serviço do IAM. Essa conta de serviço precisa ser a principal no projeto do Google Cloud que contém as APIsGoogle Cloud que você planeja consumir usando o SDK.

  1. No console do Google Cloud, selecione o projeto em que você quer criar a conta de serviço.

    • Se você criar a conta de serviço no mesmo projeto que contém as APIs Google Cloud , ela será adicionada automaticamente como principal ao projeto.

    • Se você criar a conta de serviço em um projeto diferente daquele em que as APIsGoogle Cloud estão ativadas, será necessário adicionar a conta de serviço a esse projeto em uma etapa extra. Para mais informações, consulte Adicionar a conta de serviço ao projeto do Google Cloud.

  2. Crie uma conta de serviço para autenticação e autorização a fim de acessar as APIs Google Cloud .

    Acesse as Contas de serviço

    Para mais informações sobre como criar uma conta de serviço, consulte Criar uma conta de serviço.

  3. No Console do Google Cloud, conceda à conta de serviço os papéis do IAM necessários para acessar a funcionalidade da API. Para entender o requisito de função para Google Cloud APIs, consulte a documentação da API individual e siga o princípio do menor privilégio. Para mais informações sobre os papéis predefinidos específicos da API, consulte Referência básica e predefinida dos papéis do IAM.

  4. Se você criou a conta de serviço em um projeto diferente daquele que contém as APIs Google Cloud que pretende consumir usando o SDK, anote o nome da conta de serviço. Você especifica o nome ao adicionar a conta de serviço a esse projeto.

Adicionar a conta de serviço ao projeto do Google Cloud

Se você criou a conta de serviço do ABAP SDK for Google Cloud em um projeto diferente do projeto que contém as APIs Google Cloud que você pretende consumir usando o SDK, será necessário adicionar a conta de serviço ao projeto do Google Cloud que contém as APIs Google Cloud .

Se você criou a conta de serviço no mesmo projeto que contém as APIsGoogle Cloud , pule esta etapa.

Para adicionar uma conta de serviço ao projeto do Google Cloud que contém as APIs Google Cloud , siga estas etapas:

  1. No console do Google Cloud, acesse a página de Permissões do IAM.

    Acessar as permissões do IAM

  2. Confirme se o nome do projeto que contém as APIsGoogle Cloud de destino é exibido próximo à parte de cima da página. Exemplo:

    Permissões do projeto 'PROJECT_NAME'

    Caso contrário, mude de projeto.

  3. Na página de Permissõesdo IAM, clique em Conceder acesso.

  4. Na caixa de diálogo Conceder acesso a 'PROJECT_NAME' que é exibida, siga estas etapas:

    1. No campo Novos principais, especifique o nome da conta de serviço.
    2. No campo Selecionar uma função, especifique uma função relevante. Por exemplo, no Pub/Sub, para modificar tópicos e assinaturas, além de acessar para publicar e consumir mensagens, é possível especificar o papel Editor do Pub/Sub (roles/pubsub.editor).

      Para mais detalhes sobre os papéis predefinidos específicos da API, consulte Referência básica e predefinida dos papéis do IAM.

    3. Adicione papéis conforme necessário para o uso da API. Recomendamos a implementação do princípio de privilégio mínimo.

    4. Clique em Salvar. A conta de serviço aparece na lista de principais do projeto na página IAM.

A conta de serviço agora pode ser usada para acessar as APIs Google Cloud neste projeto.

Conceder à conta de serviço acesso ao pool de federação de identidade da carga de trabalho

Para representar contas de serviço de cargas de trabalho federadas, conceda o Usuário de identidade da carga de trabalho (roles/iam.workloadIdentityUser) na conta de serviço. Para mais informações sobre como conceder papéis, consulte Gerenciar acesso.

Para conceder à conta de serviço acesso ao pool de federação de identidade da carga de trabalho, faça o seguinte:

  1. No Console do Google Cloud, acesse a página Pools de Identidades da carga de trabalho.

    Acesse Pools de identidade da carga de trabalho

  2. Selecione o pool de identidade da carga de trabalho que você criou na seção Configurar a federação de identidade da carga de trabalho.

  3. Para conceder acesso ao pool de identidades da carga de trabalho, clique em Conceder acesso.

  4. Na lista Conta de serviço, selecione a conta que tem acesso às APIs Google Cloud . Se você usa várias contas de serviço, adicione todas elas aqui.

  5. No campo Nome do atributo, selecione Assunto.

  6. No campo Valor do atributo, insira o endereço de e-mail da conta de serviço recuperado do servidor de metadados, entre aspas duplas. Por exemplo, "svc-acct-compute@example-project-123456.iam.gserviceaccount.com".

    Para saber como recuperar o endereço de e-mail da conta de serviço do servidor de metadados, consulte Coletar detalhes da instância do servidor de metadados do Google.

  7. Na caixa de diálogo Configurar seu aplicativo exibida, clique em Dispensar.

Configurar chave do cliente

  1. Na GUI do SAP, execute o código de transação /GOOG/SDK_IMG.

    Como alternativa, execute o código da transação SPRO e clique em IMG de referência do SAP.

  2. Clique em ABAP SDK for Google Cloud > Configurações básicas > Configurar chave do cliente.
  3. Clique em Novas entradas.
  4. Insira valores nos campos a seguir:

    Campo Descrição
    Nome da chave do Google Cloud Especifique um nome da configuração da chave do cliente.
    Nome da conta de serviço do Google Cloud Especifique o nome da conta de serviço, no formato de endereço de e-mail, que foi criada para acessar as APIs Google Cloud na etapa Criar uma conta de serviço. Por exemplo: sap-example-svc-acct@example-project-123456.iam.gserviceaccount.com.
    Escopo do Google Cloud Especifique o escopo de acesso à API, https://www.googleapis.com/auth/cloud-platform.
    Identificador de projeto do Google Cloud Especifique o ID do projeto do Google Cloud em que você criou o pool de Identidade da carga de trabalho.
    Nome do comando Deixe esse campo em branco.
    Classe de autorização Especifique a classe de autenticação conforme apropriado:
    • /GOOG/CL_AUTH_WIF_META_ACCESS: gera tokens OAuth assinados pelo Google.
    • /GOOG/CL_AUTH_WIF_META_IDTOKEN: gera tokens de ID assinados pelo Google.
    Armazenamento de tokens em cache

    A flag que determina se os tokens de acesso recuperados de Google Cloud são armazenados em cache.

    Recomendamos que você ative o armazenamento em cache do token depois de concluir a configuração e o teste da sua conexão com Google Cloud.

    Token de atualização em segundos Deixe esse campo em branco.
    Parâmetro de autorização 1 Especifique o ID do pool de identidades de cargas de trabalho.
    Parâmetro de autorização 2 Especifique o ID do provedor de identidade da carga de trabalho.
  5. Salve a entrada.

Federação de identidade da carga de trabalho com IdPs externos

É possível usar a federação de identidade da carga de trabalho com IdPs externos, como a Amazon Web Services (AWS), ou com qualquer provedor de identidade (IdP) compatível com o OpenID Connect (OIDC), como o Microsoft Azure ou o SAML 2.0.

Para autenticação com tokens usando a federação de identidade da carga de trabalho, as etapas gerais de configuração são as seguintes:

  1. Prepare seu IdP externo.
  2. Em Google Cloud, configure a federação de identidade da carga de trabalho.
  3. Em Google Cloud, crie uma conta de serviço.
  4. Em Google Cloud, permita que a carga de trabalho externa represente a conta de serviço.
  5. No ABAP SDK for Google Cloud, implemente o código ABAP para recuperar tokens de segurança do seu IdP.
  6. No ABAP SDK for Google Cloud, configure a chave do cliente.

Nem todos os Google Cloud produtos são compatíveis com a federação de identidade da carga de trabalho. Antes de configurar a autenticação usando a federação de identidade da carga de trabalho, consulte a lista de produtos compatíveis e limitações. Para mais informações, consulte Federação de identidade da força de trabalho: produtos e limitações com suporte.

Preparar seu IdP externo

Você precisa preparar seu IdP para que sua carga de trabalho SAP possa receber credenciais que possam ser trocadas por um token de segurança do Google OAuth 2.0.

Para preparar o IdP externo, siga as etapas dependendo do IdP:

Configurar a federação de identidade da carga de trabalho

Em Google Cloud, configure o pool de identidade e os provedores da carga de trabalho.

Você configura um pool de identidades, que é uma entidade que permite gerenciar identidades externas. Você também configura um provedor de pool de identidade da carga de trabalho, que é uma entidade que descreve uma relação entre Google Cloud e seu IdP.

Para configurar a federação de identidade da carga de trabalho, execute as etapas, dependendo do IdP externo:

Anote o seguinte:

  • Número do projeto: o número do projeto do Google Cloud em que você criou o pool de Identidade da carga de trabalho.
  • ID do pool: um ID exclusivo que identifica o pool de identidades da carga de trabalho.
  • ID do provedor: um ID que identifica o provedor do pool de identidades da carga de trabalho.

Você precisa delas para a configuração da chave de cliente do SDK ABAP.

Criar uma conta de serviço

No console do Google Cloud, crie uma conta de serviço do IAM dedicada para acessar as APIs Google Cloud . Essa conta de serviço precisa ser a principal no projeto do Google Cloud que contém as APIsGoogle Cloud que você planeja consumir usando o SDK.

  1. No console do Google Cloud, ative a API IAM Service Account Credentials, a API Security Token Service e todas as outras APIs compatíveis que você planeja acessar usando o SDK.

    Acessar a biblioteca de APIs

    Para informações sobre como ativar Google Cloud APIs, consulte Como ativar APIs.

  2. Crie uma conta de serviço que represente a carga de trabalho.

  3. Conceda à conta de serviço os papéis do IAM necessários para acessar a funcionalidade da API. Para entender o requisito de função para Google Cloud APIs, consulte a documentação da API individual e siga o princípio do menor privilégio. Para mais informações sobre papéis predefinidos específicos da API, consulte Encontrar papéis do IAM para Google Cloud APIs.

Permitir que a carga de trabalho externa represente a conta de serviço

Para permitir que a carga de trabalho externa represente a conta de serviço, execute as etapas dependendo do IdP externo:

Implemente o código ABAP para recuperar tokens de segurança do seu IdP

O ABAP SDK for Google Cloud disponibiliza uma classe abstrata /GOOG/CL_AUTH_WIF_BASE, que tem a lógica para recuperar tokens de segurança OAuth 2.0 do Security Token Service e tokens de acesso OAuth 2.0 da API Service Account Credentials do IAM. Como desenvolvedor, você precisa criar uma classe filha no seu namespace que seja herdeira da classe abstrata /GOOG/CL_AUTH_WIF_BASE.

Para invocar as funções do Cloud Run do ABAP SDK for Google Cloud usando a federação de identidade da carga de trabalho, o SDK disponibiliza outra classe abstrata /GOOG/CL_AUTH_WIF_ID_TOKEN. Se você configurar a autenticação usando a federação de identidade da carga de trabalho, precisará criar mais uma classe filha no namespace herdada da classe abstrata /GOOG/CL_AUTH_WIF_ID_TOKEN. Essa classe filha é especificada no campo Classe de autorização ao configurar a chave do cliente para invocar as funções do Cloud Run.

Implemente o método GET_EXT_IDP_TOKEN na classe filha e escreva a lógica para receber o token de segurança do IdP. Preencha os seguintes campos:

  • CV_TOKEN: o token recuperado do IdP no formato string.
  • CV_TOKEN_TYPE: o tipo do token de segurança recuperado do IdP. Os tipos de token compatíveis são:
    • 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

Os valores preenchidos em CV_TOKEN e CV_TOKEN_TYPE são usados por métodos da classe abstrata /GOOG/CL_AUTH_WIF_BASE para trocar e recuperar o token OAuth 2.0 final, que é usado nas chamadas de API.

O exemplo a seguir mostra as implementações de amostra do método GET_EXT_IDP_TOKEN para outros provedores de nuvem, como AWS e 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.

Configurar chave do cliente

  1. Na GUI do SAP, execute o código de transação /GOOG/SDK_IMG.

    Como alternativa, execute o código da transação SPRO e clique em IMG de referência do SAP.

  2. Clique em ABAP SDK for Google Cloud > Configurações básicas > Configurar chave do cliente.
  3. Clique em Novas entradas.
  4. Insira valores nos campos a seguir:

    Campo Descrição
    Nome da chave do Google Cloud Especifique um nome da configuração da chave do cliente.
    Nome da conta de serviço do Google Cloud Especifique o nome da conta de serviço, no formato de endereço de e-mail, que foi criada para acessar as APIs Google Cloud na etapa Criar uma conta de serviço. Por exemplo: sap-example-svc-acct@example-project-123456.iam.gserviceaccount.com.
    Escopo do Google Cloud Especifique o escopo de acesso à API, https://www.googleapis.com/auth/cloud-platform.
    Identificador de projeto do Google Cloud Especifique o ID do projeto do Google Cloud em que você criou o pool de Identidade da carga de trabalho.
    Nome do comando Deixe esse campo em branco.
    Classe de autorização Especifique a classe filha, que contém a implementação da classe /GOOG/CL_AUTH_WIF_BASE. Para mais informações, consulte Implementar o código ABAP para recuperar tokens de segurança do IdP.
    Armazenamento de tokens em cache

    A flag que determina se os tokens de acesso recuperados de Google Cloud são armazenados em cache.

    Recomendamos que você ative o armazenamento em cache do token depois de concluir a configuração e o teste da sua conexão com Google Cloud.

    Token de atualização em segundos Deixe esse campo em branco.
    Parâmetro de autorização 1 Especifique o ID do pool de identidades de cargas de trabalho.
    Parâmetro de autorização 2 Especifique o ID do provedor de identidade da carga de trabalho.
  5. Salve a entrada.

Receber suporte

Se você precisar de ajuda para resolver problemas com o ABAP SDK for Google Cloud, faça o seguinte: