使用ServiceAccount Actor用户

时间:2017-06-16 14:48:12

标签: c# google-api google-drive-api google-authentication gsuite

所需技术:C#

说明:我正在努力在应用程序中创建工作流程,以便网站将在用户同意屏幕上请求Google身份验证,一旦域管理员授权,网站就可以访问该域下的所有用户并访问驱动器和团队驱动数据。

尝试进行身份验证的方法:

  1. 创建了服务帐户用户,从admin.google.com
  2. 向该用户提供了Google Scopes的必要权利
  3. 创建了超级管理员用户,为其分配了服务帐户角色,其中包含在#1中创建的服务帐户。
  4. 与ServiceAccountCredential对象一起使用的代码

    ServiceAccountCredential credential = new ServiceAccountCredential(
                        new ServiceAccountCredential.Initializer("Service_Account_Email")
    {
        Scopes = SCOPES,
        User = ADMIN_EMAIL,
    }.FromPrivateKey("PRIVATE_KEY"));
    

    通过使用ServiceAccountCredential对象,我可以根据需要列出域用户以及驱动器详细信息。唯一的问题是,为此我需要客户端创建#1中提到的服务帐户和身份验证步骤,并且还要求提供凭据(服务帐户电子邮件,私钥,管理员电子邮件),这是我不想要的。

    我尝试使用管理员用户(#2)进行身份验证,该用户具有服务帐户角色,并在用户同意屏幕上显示以下代码。

    GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
    {
        ClientSecrets = new ClientSecrets
        {
            ClientId = Constants.GoogleClientId,
            ClientSecret = Constants.GoogleClientSecret
        },
        Scopes = Constants.GoogleScopes
        //,DataStore = new FileDataStore("Drive.Api.Auth.Store")
    });
    
    UserCredential credential = new UserCredential(flow, email, response);
    
    var service1 = new DriveService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = credential,
        ApplicationName = "Drive API Service Account Sample",
    });
    

    使用上面的代码“service1.Teamdrives.List()。Execute();”始终结果团队驱动器可通过我验证的管理员用户使用,但我在UserCredential对象中传递了不同的电子邮件。

    我需要帮助,我需要能够操作所有用户的驱动器数据,一旦管理员用户(服务帐户角色)进行身份验证,无需任何用户干预

    非常感谢任何帮助。

    由于

1 个答案:

答案 0 :(得分:0)

使用的delegating domain-wide authority to a service account UserCredential中的AFAIK应该是域的成员。请注意documentation

中的警告
  

服务帐户用于执行委派,其中有效身份是域中单个用户的身份。此外,服务帐户可能无法获得额外的存储配额,也不会充当域的成员。

您可能需要尝试以下步骤来授予访问权限(需要具有服务和应用程序管理员角色的帐户):

  • 登录Google管理员并转到应用 - > G套房 - >驱动器和文档 - >共享设置子菜单,然后从共享选项
  • 中选择开启
  • 点击管理团队驱动器子菜单,然后点击要授予其访问权限的团队驱动器
  • 点击会员访问弹出窗口中的添加会员
  • 输入服务帐户帐户ID(电子邮件),选择访问级别(我选择了完整版),选中跳过发送通知,然后点击发送

有关其他见解,请参阅这些SO帖子和教程: