在C#.NET中进行身份验证以使用Google表格与服务帐户而不是个人帐户

时间:2016-12-21 16:44:41

标签: c# json google-sheets-api service-accounts

我开发的应用程序使用了一些Google表格。

我能够弄清楚如何使用以下代码访问Google表格API:

    UserCredential credential;
    using (var stream =
                  new FileStream("client_secret.json", FileMode.Open, FileAccess.Read))
    {
        string credPath = System.Environment.GetFolderPath(
            System.Environment.SpecialFolder.Personal);


        credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
            GoogleClientSecrets.Load(stream).Secrets,
            Scopes,
            "user",
            CancellationToken.None,
            new FileDataStore(credPath, true)).Result;
        Console.WriteLine("Credential file saved to: " + credPath);
    }
    // Create Google Sheets API service.
    var service = new SheetsService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = credential,
        ApplicationName = ApplicationName,
    });

这个应用程序将被其他一些人使用 - 但是他们第一次运行应用程序时会要求他们登录Google - 但是他们的帐户没有给他们适当的访问权限。

我认为(如果我错了,请纠正我) - 使用服务帐户应解决我的问题,不再提示用户“登录”,但仍允许我的应用程序正确阅读/更新表格。

我想把我现有的代码修改为使用服务帐户,但我找不到任何关于如何做到这一点的好文档。我创建了服务帐户,并将ServiceAccount.json文件放在与当前“client_secret.json”文件相同的位置,但我不确定如何继续进行。

我尝试将代码更改为:

    ServiceAccountCredential credential;
    //UserCredential credential;
    using (var stream =
        new FileStream("HelperServiceAccount.json", FileMode.Open, FileAccess.Read))
    {
        string credPath = System.Environment.GetFolderPath(
            System.Environment.SpecialFolder.Personal);


        credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
            GoogleClientSecrets.Load(stream).Secrets,
            Scopes,
            "user",
            CancellationToken.None,
            new FileDataStore(credPath, true)).Result;
            )
        Console.WriteLine("Credential file saved to: " + credPath);
    }
    // Create Google Sheets API service.
    var service = new SheetsService(new BaseClientService.Initializer()
    {
        HttpClientInitializer = credential,
        ApplicationName = ApplicationName,
    });

但它失败了 - 凭证变量给出了错误。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您应该已经创建了服务帐户并存储了json凭证文件:

然后试试这个:

        ServiceAccountCredential credential;
        string[] Scopes = { SheetsService.Scope.Spreadsheets };
        string serviceAccountEmail = "xxxxxxxxxxxx@xxxxxxxx.iam.gserviceaccount.com";
        string jsonfile = "xxxxxxxx-xxxxxxx.json";
        using (Stream stream = new FileStream(@jsonfile, FileMode.Open, FileAccess.Read, FileShare.Read))
        {
            credential = (ServiceAccountCredential)
                GoogleCredential.FromStream(stream).UnderlyingCredential;

            var initializer = new ServiceAccountCredential.Initializer(credential.Id)
            {
                User = serviceAccountEmail,
                Key = credential.Key,
                Scopes = Scopes
            };
            credential = new ServiceAccountCredential(initializer);
        }

答案 1 :(得分:-2)

我已经让这个项目允许用户使用json或p12凭据文件创建服务帐户凭据。如果您想访问域中的用户数据,请务必先启用宽域委派选项。

GoogleApiServiceFactory