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

问题描述

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

背景

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

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

实施

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

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

我们找到了一条帖子,指示我们随后需要进行后续调用才能将更多参与者信息发送到People API。

在使用同一服务帐户查询People 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;
}

研究该错误,我们发现了允许服务帐户在域范围内委派的参考。尝试遵循文档,我们在下面进行了设置。

Service Account

Domain Delegation

我们今天在Google支持上花费了一些时间,他们指示我们使用下面的标签进行Stack Overflow。

不确定我们要去哪里。由于这是一个测试/沙盒Google环境,因此我们一直想着一件事,即GSuite域是否已正确链接到Cloud端,但是我们还是新手,试图验证它也是正确的。

解决方法

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

此外,请确保您已委派给用户。

var gsuiteUser = "[email protected]";

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

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