2016-03-07 3 views
0

Я пытаюсь использовать Google Admin Settings API с учетной записью службы без успеха из приложения C# Console.API AdminSettings, используя учетную запись службы в приложении консоли C#

Из того, что я понял, мне сначала нужно получить токен OAuth. Я пробовал два метода для этого: с помощью Google.Apis.Auth.OAuth2.ServiceAccountCredentials или путем создания вручную утверждения JWT.

Но когда я вызываю API-интерфейс администратора с маркетом OAuth (например, максимальнымNumberOfUsers), я всегда получаю ошибку 403 с сообщением «Вы не авторизованы для выполнения операций над доменом xxx».

Я скачал GAM, так как автор называет этот API слишком, чтобы я мог составлять одни и те же HTTP-запросы. Как описано в GAM wiki, я выполнил все шаги для создания новой учетной записи службы и нового идентификатора клиента OAuth, чтобы я мог быть уверен, что это не проблема с областью. Я также активировал режим отладки, например, предложенный Джей Ли in this thread. Как поясняется в комментариях к потоку, он по-прежнему не работает с моим токеном OAuth, но вызов API успешно выполняется с помощью маркера OAM.

Таким образом, похоже, что это связано с самим токеном OAuth. Проблема, возникающая при создании токена OAuth, заключается в том, что я не могу указать свойство «sub» (или User для ServiceAccountCredentials). Если я его добавлю, я получаю 403 Запретный ответ с запрошенным клиентом. как error_description при генерации токена, то есть перед вызовом API. Так что, возможно, это проблема, но я не вижу, как ее исправить, поскольку я использую электронную почту администратора.

Другая возможность заключается в том, что для этого API необходимы учетные данные клиента OAuth, поскольку для GAM требуется два разных типа учетных данных, учетная запись службы и клиент OAuth. Поскольку я могу использовать учетные данные учетной записи службы в своем проекте, я боюсь, что я застрял, если это так ...

Я не вижу других вариантов, и я застрял с обоими, поэтому любая помощь оценили. Благодаря!

Мой код:

public static string GetEnterpriseUsersCount() 
{ 
    string domain = MYDOMAIN; 

    string certPath = System.Reflection.Assembly.GetExecutingAssembly().Location; 
    certPath = certPath.Substring(0, certPath.LastIndexOf("\\") + 1) + "GAMCreds.p12"; 

    var certData = File.ReadAllBytes(certPath); 
    X509Certificate2 privateCertificate = new X509Certificate2(certData, "notasecret", X509KeyStorageFlags.Exportable); 

    ServiceAccountCredential credential = new ServiceAccountCredential(
     new ServiceAccountCredential.Initializer(SERVICE_ACCOUNT_EMAIL) 
     { 
      Scopes = new[] { "https://apps-apis.google.com/a/feeds/domain/" }, 
      User = ADMIN_EMAIL 
     }.FromCertificate(privateCertificate)); 

    Task<bool> oAuthRequest = credential.RequestAccessTokenAsync(new CancellationToken()); 
    oAuthRequest.Wait(); 


    string uri = string.Format("https://apps-apis.google.com/a/feeds/domain/2.0/{0}/general/maximumNumberOfUsers", domain); 

    HttpWebRequest request = WebRequest.Create(uri) as HttpWebRequest; 
    if (request != null) 
    { 
     request.Method = "GET"; 
     request.Headers.Add("Authorization", string.Format("Bearer {0}", credential.Token.AccessToken)); 

     // Return the response 
     using (WebResponse response = request.GetResponse()) 
     { 
      using (StreamReader sr = new StreamReader(response.GetResponseStream())) 
      { 
       return sr.ReadToEnd(); 
      } 
     } 
    } 

    return null; 
} 

Edit: я сосредоточился на областях, как посоветовал Джей Ли ниже, и кажется, что недостающий сфера была "https://www.googleapis.com/auth/admin.directory.domain. Однако нигде это не написано на странице документации API-параметров администратора. По крайней мере, я этого не нашел. 'https://apps-apis.google.com/a/feeds/domain/' тоже необходимо, но я уже добавил его в список разрешенных областей. Спасибо, Джей!

Редактировать 2: Я также обновил исходный код, чтобы он мог помочь в будущем.

ответ

1

Вам необходимо предоставить доступ к идентификатору клиента вашей учетной записи службы для областей API админов. Следуйте за Drive domain wide delegation instructions за исключением sub в правильной правильной области. Тогда вы можете установить sub = без ошибки.

+0

Я редактировал вопрос, следующий за вашим комментарием. Спасибо! – Ryan

Смежные вопросы