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

Service Account - Must be a G Suite domain user

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

背景

我们有一个 device/display 显示 given/specific GSuite Room 资源的日历和事件信息。

作为显示有关特定事件的信息的一部分,我们希望显示 attendee/invitee 个姓名。

实施

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

实施正在使用 Google 的 .NET 客户端库。

我们发现 post 指示我们需要进行跟进电话,以便向人们 API 获取更多与会者信息。

使用相同的服务帐户查询人员 API 时,我们收到错误 Must be a G Suite domain user

{
  "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."
}

下面是当前被破解的代码,只是试图对 People Service 进行成功查询 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;
}

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

我们今天花了一些时间在 Google 支持上,他们用下面的标签将我们引导到 Stack Overflow。

不确定我们哪里出错了。由于这是一个 test/sandbox Google 环境,我们一直在想的一件事是 GSuite 域是否正确链接到云端,但我们一直是尝试验证其正确性的新手.

您需要为服务帐户设置全域委派这是我所知道的最好的文档。 Perform G Suite Domain-Wide Delegation of Authority

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

var gsuiteUser = "user@YourDomain.com";

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

要从人们那里阅读 api 你需要一个你正在阅读其数据的人,或者你只是要阅读它没有的服务帐户数据。