gpt4 book ai didi

c# - 服务帐户 - 必须是 G Suite 域用户

转载 作者:行者123 更新时间:2023-12-04 15:17:14 27 4
gpt4 key购买 nike

这是我的团队首次尝试使用 Google Cloud 和 GSuite 实现功能。在搜索问题和社区之后,我还没有找到似乎是正确的前进道路,或者至少没有设法获得所需的功能。

背景

我们有一个设备/显示器可以显示给定/特定 GSuite Room 资源的日历和事件信息。

作为显示有关特定事件的信息的一部分,我们希望显示与会者/受邀者的姓名。

实现

我们正在使用服务帐户成功调用日历 API。但是,当事件信息返回时,与会者信息仅包括与会者的电子邮件地址。

实现使用 Google 的 .NET 客户端库。

我们发现了一个帖子,指示我们随后需要进行跟进调用,以便向 People API 获取更多与会者信息。

当使用相同的服务帐户查询 People API 时,我们收到错误消息必须是 G Suite 域用户

{
"type": "https://tools.ietf.org/html/rfc7231#section-6.6.1",
"title": "An error occured while processing your request.",
"status": 500,
"detail": "Google.Apis.Requests.RequestError\nMust be a G Suite domain user. [400]\nErrors [\n\tMessage[Must be a G Suite domain user.] Location[ - ] Reason[failedPrecondition] Domain[global]\n]\n",
"traceId": "|6007b977-42e9ca34c40a6cb0."
}

下面是当前拼凑的代码,只是试图对人员服务 API 进行成功查询

public async Task<IList<Person>> GetAttendees(string tenant, string spaceEmail)
{

var serviceAccount = _redisCache.GoogleTenantCredentials.StringGet(tenant).ToString();
var svcDto = JsonConvert.DeserializeObject<ServiceAccountDto>(serviceAccount);
if (!string.IsNullOrEmpty(serviceAccount))
{
var credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(svcDto.ClientEmail)
{
Scopes = new[] { PeopleServiceService.Scope.DirectoryReadonly }
}.FromPrivateKey(svcDto.PrivateKey));


var svc = new PeopleServiceService(new BaseClientService.Initializer { HttpClientInitializer = credential });

var request = svc.People.ListDirectoryPeople();
request.ReadMask = "names,emailAddresses";
request.Sources = PeopleResource.ListDirectoryPeopleRequest.SourcesEnum
.DIRECTORYSOURCETYPEDOMAINPROFILE;

var result = await request.ExecuteAsync();
return result.People;
}
return null;
}

研究错误后,我们找到了允许服务帐户全域委派的引用资料。尝试按照文档进行操作,我们在下面进行了设置。

Service Account

Domain Delegation

今天我们花了一些时间与 Google 支持人员联系,他们将我们引导至带有以下标签的 Stack Overflow。

不确定我们哪里出错了。由于这是一个测试/沙盒 Google 环境,我们一直在想的一件事是 GSuite 域是否正确链接到云端,但我们在尝试验证它是否正确方面也是新手。

最佳答案

您需要为服务帐户设置域范围的委托(delegate),这是我所知道的最好的文档。 Perform G Suite Domain-Wide Delegation of Authority

除此之外,请确保您已委托(delegate)给用户。

var gsuiteUser = "user@YourDomain.com";

var credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(svcDto.ClientEmail)
{
User = gsuiteUser,
Scopes = new[] { PeopleServiceService.Scope.DirectoryReadonly }
}.FromPrivateKey(svcDto.PrivateKey));

要从 people api 读取数据,您需要一个人拥有您正在读取的数据,或者您将要读取它没有任何数据的服务帐户数据。

关于c# - 服务帐户 - 必须是 G Suite 域用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64112645/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com