Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#NET中通过身份验证将Google Sheets与服务帐户而不是个人帐户一起使用_C#_Json_Google Sheets Api_Service Accounts - Fatal编程技术网

在C#NET中通过身份验证将Google Sheets与服务帐户而不是个人帐户一起使用

在C#NET中通过身份验证将Google Sheets与服务帐户而不是个人帐户一起使用,c#,json,google-sheets-api,service-accounts,C#,Json,Google Sheets Api,Service Accounts,我开发了一个应用程序,它使用了一些Google表单 我能够通过以下代码了解如何让它访问Google Sheets API: UserCredential credential; using (var stream = new FileStream("client_secret.json", FileMode.Open, FileAccess.Read)) { string credPath = System.Enviro

我开发了一个应用程序,它使用了一些Google表单

我能够通过以下代码了解如何让它访问Google Sheets 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,
    });
这个应用程序将被其他一些人使用——但是当他们第一次运行这个应用程序时,它会要求他们登录到谷歌——但是他们的帐户没有给他们适当的访问权限

我认为(如果我错了,请纠正我)-使用服务帐户应该可以解决我的问题,不再提示用户“登录”,但仍然允许我的应用程序适当地阅读/更新工作表

我想使用我现有的代码并修改它以使用服务帐户,但我找不到任何关于如何做到这一点的好文档。我已经创建了服务帐户,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,
    });
但是它失败了-credential变量给出了一个错误


有什么想法吗?

我制作了这个项目,允许用户使用json或p12凭据文件创建服务帐户凭据。如果要从域访问用户数据,请确保在访问之前启用广域委派选项


您应该已经创建了服务帐户并存储了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);
        }

您可能需要查看有关的文档,这将解释如何正确授权服务帐户访问Google Sheet API。nodejs的一个例子是,可以使用服务帐户访问Sheets API。最后,请尝试阅读,这将帮助您理解c#的代码实现。帮帮忙,谢谢!我想我在网上的一些旅行中偶然发现了这个网站,尽管它处理的是p12文件,我专门处理的是一个.json文件。我想我已经快到了,谢谢你的帮助!欢迎链接到某个解决方案,但请确保您的答案在没有它的情况下是有用的:这样您的其他用户就会知道它是什么以及为什么存在,然后引用您链接到的页面的最相关部分,以防目标页面不可用。非常感谢。这对我有用。它看起来不像是最干净的(官方)模式,但它给出了正确的结果。我希望GoogleSheetsAPI提供一种简单的方法,通过一次调用直接从流创建ServiceAccountCredential,就像GoogleWebAuthorizationBroker一样。