使用服务帐户访问用户帐户

时间:2020-01-27 16:03:56

标签: google-cloud-platform google-admin-sdk

我们需要使用API​​来验证某个用户是否作为托管帐户存在(这意味着它属于我们的Google Domain组织)。

GSuite adminSDK执行该操作,但是,它需要OAuth2身份验证,该身份验证由经过身份验证的用户-https://developers.google.com/admin-sdk/reports/v1/guides/authorizing授权。

我的问题是,是否可以通过服务帐户使用该API,或者通过任何其他方法通过服务帐户检索此信息,因为它将在Server-2-Server方案中使用。

谢谢, 瓦斯科

2 个答案:

答案 0 :(得分:0)

您可能知道,服务帐户不属于单个最终用户,而属于应用程序。但是,G Suite域的管理员可以授权服务帐户访问用户数据,即模拟域中的用户。这称为全域授权

要实现此目的,请转到管理控制台,然后按照步骤specified here

参考:

答案 1 :(得分:0)

因为这是完全不明显的-文档对此“提示”,但是请不要拼写清楚,我很难找到任何有效的示例。他们都不断返回此错误:

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;
        }
    }

希望这可以使其他人免于头痛。