Интеграция с Google Admin SDK в C # - PullRequest
7 голосов
/ 01 мая 2019

В настоящее время я пытаюсь интегрироваться с SDK Google Admin через C #, чтобы мы могли управлять пользователями через нашу собственную систему. Однако при запуске проекта я получаю ошибку: Unauthorized Client.

Вещи, которые я уже сделал через учетную запись супер администратора:

  • Настройка учетной записи службы
  • Включено делегирование GSuite по всему домену для учетной записи службы
  • Включен доступ к API
  • Добавлен идентификатор клиента учетных записей служб в API Client Access с областью действия (https://www.googleapis.com/auth/admin.directory.user)

Вот код, который я использую.

ServiceAccountCredential credential = new ServiceAccountCredential(
                new ServiceAccountCredential.Initializer(_googleServiceSettings.Client_Email)
                {
                    ProjectId = _googleServiceSettings.Project_Id,
                    User = "superadmin@google.com",
                    Scopes = new[] { DirectoryService.Scope.AdminDirectoryUser }
                }.FromPrivateKey(_googleServiceSettings.Private_Key));

            var service = new DirectoryService(new BaseClientService.Initializer
            {
                HttpClientInitializer = credential,
                ApplicationName = "Test API"
            });

            var request = service.Users.Get("user@google.com");
            var result = await request.ExecuteAsync();

Я получаю полную ошибку

Произошло необработанное исключение при выполнении запроса. Google.Apis.Auth.OAuth2.Responses.TokenResponseException: Ошибка: "unauthorized_client", Описание: "Клиент не авторизован для получения маркеров доступа с использованием этого метода, или клиент не авторизован для какой-либо из запрошенных областей.", Uri: ""

Ответы [ 3 ]

4 голосов
/ 07 мая 2019

Пример кода, который будет печатать некоторую информацию о пользователе.

Важным элементом является класс Google.Apis.Admin.Directory.directory_v1.Data.User

Документация ссылка .

Ваша ошибка вызвана неправильным созданием учетных данных. Обычно проблема с областями при создании учетных данных. Я предполагаю, что вы правильно настроили делегирование домена для учетной записи службы.

Я также предполагаю, что пользователь, под которым вы изображаете себя, - это G Suite Super Admin. Если нет, вы увидите ошибку 403 для service.Users.Get().

Файл service_account.json - это обычный файл JSON, который вы загрузили из консоли Google (или создали с помощью gcloud).

Пользователь user1@example.com - это адрес электронной почты пользователя G Suite, для которого будет отображаться информация.

Пользователь admin@example.com - это G Suite Super Admin.

using Google.Apis.Auth.OAuth2;
using Google.Apis.Admin.Directory.directory_v1;
using Google.Apis.Admin.Directory.directory_v1.Data;
using Google.Apis.Services;
using System;
using System.IO;

// dotnet add package Google.Apis.Admin.Directory.directory_v1
// Tested with version 1.39.0.1505

// Google.Apis.Admin.Directory.directory_v1.Data.User
// https://developers.google.com/resources/api-libraries/documentation/admin/directory_v1/csharp/latest/classGoogle_1_1Apis_1_1Admin_1_1Directory_1_1directory__v1_1_1Data_1_1User.html

namespace Example
{
    class Program
    {
        static void Main(string[] args)
        {
            // Service Account with Domain-Wide delegation
            var sa_file = "service_account.json";

            // G Suite User to impersonate
            var user_email = "admin@example.com";

            // G Suite User to get information about
            var gs_email = "user1@example.com";

            // Scopes
            var scopes = "https://www.googleapis.com/auth/admin.directory.user";

            var credential = GoogleCredential.FromFile(sa_file)
                        .CreateScoped(scopes)
                        .CreateWithUser(user_email);

            // Create Directory API service.
            var service = new DirectoryService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credential
            });

            try {
                var request = service.Users.Get(gs_email);

                var result = request.Execute();

                Console.WriteLine("Full Name: {0}", result.Name.FullName);
                Console.WriteLine("Email:     {0}", result.PrimaryEmail);
                Console.WriteLine("ID:        {0}", result.Id);
                Console.WriteLine("Is Admin:  {0}", result.IsAdmin);
            } catch {
                Console.WriteLine("User not found.");
            }
        }
    }
}
3 голосов
/ 06 мая 2019

Если вы хотите использовать служебную учетную запись, вы можете авторизоваться с помощью приведенного ниже кода.

String serviceAccountEmail = "yourserviceaccountmail";
public GmailService GetService(string user_email_address)
    {

        var certificate = new X509Certificate2(@"yourkeyfile.p12", 
"notasecret", X509KeyStorageFlags.Exportable);

        ServiceAccountCredential credential = new ServiceAccountCredential(
                   new ServiceAccountCredential.Initializer(serviceAccountEmail)
                   {

                       User = user_email_address,
                       Scopes = new[] { GmailService.Scope.MailGoogleCom }
                   }.FromCertificate(certificate));

        GmailService service = new GmailService(new BaseClientService.Initializer()
        {
            HttpClientInitializer = credential,
            ApplicationName = AppName,
        });

        return service;
    }

Вы можете перечислить пользователей, использующих этот сервис. Это работа для меня.

И вы можете перечислить список пользователей с кодом ниже. (с DirectoryService)

public Users GetDirService()//UserList with DirectoryService
    {
        string Admin_Email = "yoursuperadminemail";
        string domain = "yourdomain.com";
        try
        {
            var certificate = new X509Certificate2(@"yourkeyfile.p12", "notasecret", X509KeyStorageFlags.Exportable);

            ServiceAccountCredential credentialUsers = new ServiceAccountCredential(
            new ServiceAccountCredential.Initializer(serviceAccountEmail)
            {
                Scopes = new[] { DirectoryService.Scope.AdminDirectoryUser },
                User = Admin_Email,
            }.FromCertificate(certificate));

            var serviceUsers = new DirectoryService(new BaseClientService.Initializer()
            {
                HttpClientInitializer = credentialUsers,
                ApplicationName = AppName,
            });
            var listReq = serviceUsers.Users.List();
            listReq.Domain = domain;
            Users users = listReq.Execute();
            return users;
        }
        catch (Exception ex)
        {
            MessageBox.Show("your mail address must be super admin authorized.", "Warning", MessageBoxButton.OK, MessageBoxImage.Warning);
            return null;
        }

    }
1 голос
/ 07 мая 2019

Хорошо, я решил проблему.

Добавление следующей области через настройки безопасности на портале Google решило проблему. Это странно, так как их собственный пример не требует, чтобы эта область была добавлена, и их документация не говорит, что это требуется для этого метода.

https://www.googleapis.com/auth/admin.directory.group

...