在C#NET中通过身份验证将Google Sheets与服务帐户而不是个人帐户一起使用
我开发了一个应用程序,它使用了一些Google表单 我能够通过以下代码了解如何让它访问Google Sheets API:在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
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一样。