Я пытаюсь использовать 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: Я также обновил исходный код, чтобы он мог помочь в будущем.
Я редактировал вопрос, следующий за вашим комментарием. Спасибо! – Ryan