我开发的应用程序使用了一些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,
});
但它失败了 - 凭证变量给出了错误。
有什么想法吗?
答案 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凭据文件创建服务帐户凭据。如果您想访问域中的用户数据,请务必先启用宽域委派选项。