问题描述
这是我的团队首次尝试使用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;
}
研究该错误,我们发现了允许服务帐户在域范围内委派的参考。尝试遵循文档,我们在下面进行了设置。
我们今天在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中读取数据,您需要一个正在读取其数据的人,或者您将要读取其中没有任何数据的服务帐户数据。