Найдено решение проблемы.
Выполнялись шаги в соответствии с 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]
}
Ответ :
Вывод поиска по каталогу.
Пример:
*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 и предоставление необходимых прав для учетной записи службы