由于这完全不明显 - 文档“暗示”了这一点,但不要拼写出来,我很难找到任何有效的具体示例。他们都一直返回这个错误:
Google.GoogleApiException: '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]
]
服务帐号必须冒充其他用户的基本问题。在底部的这个链接中提到了它,以蓝色突出显示:
https://developers.google.com/admin-sdk/directory/v1/guides/delegation
只有有权访问 Admin API 的用户才能访问 Admin SDK Directory API,因此您的服务帐号需要模拟其中一位用户才能访问 Admin SDK Directory API。此外,用户必须至少登录一次并接受 Google Workspace 服务条款。
但它只是没有点击我应该如何做到这一点 - 这是隐藏在其中一个管理控制台中的某些设置吗?不 - 您将其作为初始连接的一部分传递。
因此,只需将说明放在一个地方并希望避免其他人同样头痛,这些是步骤:
然后我创建了一个 .NET Core 控制台应用并安装了这些 NuGet 包:
- Google.Apis
- Google.Apis.Auth
- Google.Apis.Admin.Directory.directory_v1
这是一个丑陋的概念证明,一切正常:
using System;
using System.IO;
using System.Net;
using Google.Apis.Admin.Directory.directory_v1;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Services;
namespace GoogleDirectoryTest
{
class Program
{
static void Main(string[] args)
{
var dirService = GetDirectoryService(@"C:\tmp\google-cred-sample-12345abdef.json", "user-with-admin-permission-here@mydomainhere.com", "My App Name");
var list = dirService.Users.List();
list.Domain = "mydomainhere.com";
var users = list.Execute();
foreach (var user in users.UsersValue)
{
Console.WriteLine($"{user.Name.FullName}");
}
Console.ReadKey();
}
static DirectoryService GetDirectoryService(string keyfilepath, string impersonateAccount, string appName)
{
using (var stream = new FileStream(keyfilepath, FileMode.Open, FileAccess.Read))
{
var credentials = GoogleCredential.FromStream(stream).CreateWithUser(impersonateAccount);
if (credentials.IsCreateScopedRequired)
credentials = credentials.CreateScoped(new[] { DirectoryService.Scope.AdminDirectoryUserReadonly });
var service = new DirectoryService(new BaseClientService.Initializer()
{
HttpClientInitializer = credentials,
ApplicationName = appName,
});
return service;
}
}
希望这可以为其他人省去一些麻烦。