Google Admin SDK не может создать пользователя — исключение 403 запрещено

Я пытаюсь создать пользователя с помощью С# и клиентских библиотек google-admin-directory_v1-rev24-csharp-1.7.0-beta, однако продолжаю получать исключение:

Google.GoogleApiException was unhandled
  HResult=-2146233088
  Message=Google.Apis.Requests.RequestError
Not Authorized to access this resource/api [403]
Errors [
    Message[Not Authorized to access this resource/api] Location[ - ] Reason[forbidden] Domain[global]
]

Source=Google.Apis
ServiceName=admin
StackTrace:
   at Google.Apis.Requests.ClientServiceRequest`1.Execute() in c:\code\google.com\google-api-dotnet-client\default\Tools\Google.Apis.Release\bin\Debug    \output\default\Src\GoogleApis\Apis\Requests\ClientServiceRequest.cs:line 102
   at ConsoleApplication1.Program.Main(String[] args) in c:\Users\darin.BASEHEX\Documents\Visual Studio 2013\Projects    \ConsoleApplication1\ConsoleApplication1\Program.cs:line 55
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

Я начал с создания проекта в консоли разработчика, на странице настроек API я включил ADMIN SDK, на странице учетных данных я создал учетную запись службы и загрузил сертификат p12.key, заполнил экран согласия, а затем пошел на страницу «Безопасность» в консоли администратора, выберите вкладку «Дополнительно», выберите «Управление доступом стороннего клиента OAuth», вставьте идентификатор клиента из созданной мной учетной записи службы и назначьте область https://www.googleapis.com/auth/admin.directory.user/. Исключение возникает в строке:

User results = service.Users.Insert(newuserbody).Execute();

Полная программа C# приведена ниже.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Security.Cryptography.X509Certificates;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Admin.Directory.directory_v1;
using Google.Apis.Admin.Directory.directory_v1.Data;
using Google.Apis.Services;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            String serviceAccountEmail = "A bunch of alpha [email protected]";

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

            ServiceAccountCredential credential = new ServiceAccountCredential(

               new ServiceAccountCredential.Initializer(serviceAccountEmail) 

               {
                   Scopes = new[] { DirectoryService.Scope.AdminDirectoryUser },

                   User = "[email protected]"  <-------- Added ADMIN User to fix

               }.FromCertificate(certificate));

            // Create the service.

            var service = new DirectoryService(new BaseClientService.Initializer()

            {
                HttpClientInitializer = credential,
                ApplicationName = "User Provisioning",
            });

            User newuserbody = new User();
            UserName newusername = new UserName();
            newuserbody.PrimaryEmail = "[email protected]";
            newusername.GivenName = "Bob";
            newusername.FamilyName = "Bacon";
            newuserbody.Name = newusername;
            newuserbody.Password = "iambacon";

            User results = service.Users.Insert(newuserbody).Execute();

        Console.WriteLine("Press any key to continue!");
            Console.ReadKey();
        }
    }
}

Я чувствую, что это что-то действительно простое, чего мне не хватает, однако у меня закончились идеи о том, на что смотреть. Любая помощь будет принята с благодарностью!


person user3149930    schedule 06.01.2014    source источник
comment
Вы уверены, что административный SDK включен в этом проекте? Как правило, код состояния 403 возникает из-за того, что API не включен, поэтому убедитесь, что он включен.   -  person peleyal    schedule 07.01.2014
comment
Привет, Пелеял. Да, для проекта включен ADMIN SDK.   -  person user3149930    schedule 07.01.2014


Ответы (1)


Не похоже, чтобы ваша учетная запись службы выдавала себя за кого-либо из пользователей в этом вызове. Если вы хотите использовать учетную запись службы для создания нового пользователя, вам необходимо выдать себя за учетную запись администратора (Примечание: только администратор может создавать пользователей).

Взгляните на этот пример Диска для делегирования всего домена:

https://developers.google.com/drive/delegation

Вы можете видеть, что для части .net есть дополнительная строка:

ServiceAccountUser = пользовательская электронная почта

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

person Emily    schedule 06.01.2014
comment
Спасибо Эмили! Вот оно. Пришлось добавить члена пользователя в ServiceAccountCredential.Initializer. Я отредактировал исходный код выше для справки для других бедных старых дерьмов, таких как я, бьющихся головой о стену. - person user3149930; 07.01.2014