Google Cloud Rest API C # - PullRequest
       9

Google Cloud Rest API C #

0 голосов
/ 11 ноября 2018

У меня проблемы с Google Cloud API. Я успешно вошел в систему и создал новый ключ с помощью API, но проблема в том, чтобы соединиться с новым ключом, потому что файл JSON, который был впервые создан Google (в пользовательском интерфейсе), отличается от файла JSON, полученного из API. Я не могу войти с новым ключом, Google выдает ошибку.

Мой код:

    private static void ServiceAccounts(string credentialsJson)
    {
        LoginAsServiceAccountWithJson(credentialsJson);

        IList<ServiceAccountKey> serviceAccountKeys = ListKeysOfServiceAccount(userEmail);

        ServiceAccountKey newKey = CreateKeyOfServiceAccount(userEmail);

        //DeleteKeyOfServiceAccount(newKey);

        LoginWithServiceAccountKey(newKey, credentialsJson);
    }

    public static void LoginAsServiceAccountWithJson(string credentialsJson)
    {
        //Create credentials from the JSON file that we receive from GCP.
        GoogleCredential credential = GoogleCredential.FromJson(credentialsJson)
        .CreateScoped(IamService.Scope.CloudPlatform);

        // Create the Cloud IAM service object
        s_service = new IamService(new IamService.Initializer
        {
            HttpClientInitializer = credential
        });

        ListRolesResponse response = s_service.Roles.List().Execute();
    }

    public static ServiceAccountKey CreateKeyOfServiceAccount(string userEmail)
    {
        var newKeyDetails = s_service.Projects.ServiceAccounts.Keys.Create(
            new CreateServiceAccountKeyRequest(), "projects/-/serviceAccounts/" + userEmail);

        ServiceAccountKey key = newKeyDetails.Execute();
        return key;
    }

    public static IList<ServiceAccountKey> ListKeysOfServiceAccount(string userEmail)
    {

        IList<ServiceAccountKey> keys = s_service.Projects.ServiceAccounts.Keys
            .List($"projects/-/serviceAccounts/{userEmail}").Execute().Keys;

        return keys;
    }

Код работает, кроме функции «LoginWithServiceAccountKey», я не могу использовать ключ, который я только что получил от Google, для входа в систему. JSON отличается, даже ключ намного больше в API (я видел, что в ключе из пользовательского интерфейса размер составляет 1735 символов, а в API - 3000+). П.С. - Я знаю, что мне нужно подождать 60 секунд, прежде чем пытаться подключиться, это не проблема.

1 Ответ

0 голосов
/ 19 ноября 2018

Мне потребовалось некоторое время, чтобы выяснить, как API сочетаются друг с другом. Вот версия вашей ServiceAccounts() функции, которая вызывает Google Translate API с новым ключом:

   private static void ServiceAccounts(string credentialsJson, string userEmail)
   {
        LoginAsServiceAccountWithJson(credentialsJson);

        IList<ServiceAccountKey> serviceAccountKeys = ListKeysOfServiceAccount(userEmail);

        ServiceAccountKey newKey = CreateKeyOfServiceAccount(userEmail);

        // Call the translate API with the new key.
        byte[] jsonKey = Convert.FromBase64String(newKey.PrivateKeyData);
        Stream jsonKeyStream = new MemoryStream(jsonKey);
        ServiceAccountCredential credential = ServiceAccountCredential
            .FromServiceAccountData(jsonKeyStream);
        GoogleCredential googleCredential = GoogleCredential
            .FromServiceAccountCredential(credential);
        var client = TranslationClient.Create(googleCredential);
        var response = client.TranslateText("Hello World", "ru");
        Console.WriteLine(response.TranslatedText);           

        //DeleteKeyOfServiceAccount(newKey);

        // LoginWithServiceAccountKey(newKey, credentialsJson);
    }

Полный код здесь: https://github.com/SurferJeffAtGoogle/scratch/blob/master/StackOverflow53251345/Program.cs

...