Как вызвать API каталога данных GCP из. NET авторизации через сервисный аккаунт? - PullRequest
1 голос
/ 19 июня 2020

Я пытаюсь вызвать API каталога данных GCP, чтобы выполнить поиск. Я создал учетную запись службы в GCP.

Использование пакета Google.Cloud.DataCatalog.V1 из Nuget.

DataCatalogClientBuilder dcb = new DataCatalogClientBuilder();

dcb.CredentialsPath =  "json.json";

DataCatalogClient dataCatalogClient = dcb.Build();

SearchCatalogRequest scr = new SearchCatalogRequest();
scr.Query = "vbeln";
PagedAsyncEnumerable < SearchCatalogResponse, SearchCatalogResult >  sdjh = 
dataCatalogClient.SearchCatalogAsync(scr);

a) SearchCatalog не возвращает результат b) Я не возможность передать область действия (определение проекта, организации)

Есть ли ошибка.

Выполняется. NET Framework 4.6.1

1 Ответ

0 голосов
/ 29 июня 2020

Найдено решение проблемы.

Выполнялись шаги в соответствии с OAuth2 для учетной записи службы https://developers.google.com/identity/protocols/oauth2/service-account

Это трехэтапный процесс -:

a) Создайте токен JWT с использованием алгоритма RS256 с утверждениями / полезной нагрузкой как -:

     { "iss", "<service-account>@<project-Id>.iam.gserviceaccount.com"},
     { "scope", "https://www.googleapis.com/auth/cloud-platform" },
     { "aud", "https://oauth2.googleapis.com/token" },
     { "iat", iat},
     { "exp", exp}
var iat = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
var exp = DateTimeOffset.UtcNow.AddMinutes(60).ToUnixTimeSeconds(); \\ 60 mins usage

* Полный код для создания см. В конце этого ответа. токен RS256 JWT от. NET

б) API-интерфейс маркера вызова https://oauth2.googleapis.com/token

Запрос

grant_type = urn: ietf: params: oauth: grant-type: jwt-bearer assertion = JWT, созданный на Шаге 1

Ответ

{
    "access_token": "******************************************************",
    "expires_in": 3599,
    "token_type": "Bearer"
}

Этот access_token будет использоваться для вызова фактического API и действителен в течение 1 часа.

c) Вызов API поиска по каталогу данных: https://datacatalog.googleapis.com/v1/catalog: поиск

Метод : Опубликовать

Запрос :

  Authorization Type : Bearer Token
  Token Value        : access_token received in Step b
Body : 

{
  "scope": {
    "includeProjectIds": [
           "project-id1"
           "project-id2"
    ],
    "includeOrgIds": [
      "orgid"  
    ]
  },
  "query": "tag:project-id1.test_template1.owner:ZZZZZ OR COLUMN:VBELN"  -- Search Tag, can be fetched from [Try It link][4] or [Search Guide][4]
}

Ответ :

Вывод поиска по каталогу.

Пример: enter image description here

*Code to create JWT token from .NET to be passed to GCP OAuth Token API -:

using JWT;
using JWT.Algorithms;
using JWT.Serializers;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Security;
using System;
using System.Collections.Generic;
using System.Security.Cryptography;

namespace GCP
{
    class JWTTokenGenerationForGCPOAuthTokenAPI
    {


        public static string GenerateJWTToken()
        {
            var rsaParams = ReadAsymmetricKeyParameter();
            var encoder = GetRS256JWTEncoder(rsaParams);
            var iat = DateTimeOffset.UtcNow.ToUnixTimeSeconds();
            var exp = DateTimeOffset.UtcNow.AddMinutes(60).ToUnixTimeSeconds();

            // create the payload according to your need 
            // iss is the Service Account Email ID
            var payload = new Dictionary
            {
                { "iss",   "@.iam.gserviceaccount.com"},
                { "scope", "https://www.googleapis.com/auth/cloud-platform" },
                { "aud",   "https://oauth2.googleapis.com/token" },
                { "exp",    exp},
                { "iat",    iat}
            };
            //Final token
            var token = encoder.Encode(payload, new byte[0]);

            return token;
        }

        private static IJwtEncoder GetRS256JWTEncoder(RSAParameters rsaParams)
        {
            var csp = new RSACryptoServiceProvider();
            csp.ImportParameters(rsaParams);
            var algorithm = new RS256Algorithm(csp, csp);
            var serializer = new JsonNetSerializer();
            var urlEncoder = new JwtBase64UrlEncoder();
            var encoder = new JwtEncoder(algorithm, serializer, urlEncoder);

            return encoder;
        }



        public static RSAParameters ReadAsymmetricKeyParameter()


        {

\\ This key is fetched from the Service Account JSON File. 
\\"private_key": "-----BEGIN PRIVATE KEY-----\n-----END PRIVATE KEY-----\n",
\\ pick  from above. Replace all \n with actual new line like shown below.

                string pkey = @"MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDSoGKK/Dzb8MBy
################################################################
################################################################
################################################################
################################################################
twySMqKKWnIC/zZljrvp4w==";



            RsaPrivateCrtKeyParameters rsaPrivateCrtKeyParameters1;
            var keyBytes = Convert.FromBase64String(pkey);
            var asymmetricKeyParameter = PrivateKeyFactory.CreateKey(keyBytes);


            rsaPrivateCrtKeyParameters1 = (RsaPrivateCrtKeyParameters)asymmetricKeyParameter;

            RSAParameters r = DotNetUtilities.ToRSAParameters(rsaPrivateCrtKeyParameters1);

            return r;


        }
    }
}

Code Done in : .NET Framework 4.6.1

Nuget Packages :

Bounty Castle - Install-Package BouncyCastle -Version 1.8.6.1

Примечание: Требуется авторизация на GCP У учетной записи службы должно быть разрешение просмотра каталога данных на во всех проектах каталог данных должен искать объекты.

т.е. если сервисная учетная запись создана в project-id1, и поиск требуется как в project-id1, так и в project-id2, он должен иметь разрешение Data Catalog Viewer на как project-id1, так и project-id2.

Этот метод можно использовать для вызова любых API GCP, просто изменив Re quest Тело фактического API и предоставление необходимых прав для учетной записи службы

...