J'utilise "Google.Apis.Bigquery.v2 Client Library" avec C #.
J'autorise Google BigQuery à utiliser "Compte de service" (voir http://www.afterlogic.com/mailbee-net/docs/OAuth2GoogleServiceAccounts.html ) Pour créer le certificat X509, j'utilise la clé p12 de Google Developers Console. Cependant, pour le moment, la clé json est la valeur par défaut. Puis-je utiliser à la place la clé p12?
J'ai le code suivant:
string serviceAccountEmail = "[email protected]";
X509Certificate2 certificate;
using (Stream stream = new FileStream(@"C:\key.p12", FileMode.Open, FileAccess.Read, FileShare.Read))
{
using (MemoryStream ms = new MemoryStream())
{
stream.CopyTo(ms);
certificate = new X509Certificate2(ms.ToArray(), "notasecret", X509KeyStorageFlags.Exportable);
}
}
// Create credentials
ServiceAccountCredential credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
Scopes = new[] {
BigqueryService.Scope.Bigquery,
BigqueryService.Scope.CloudPlatform,
},
}.FromCertificate(certificate));
// Create the service
BaseClientService.Initializer initializer = new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "My Application",
GZipEnabled = true,
};
BigqueryService service = new BigqueryService(initializer);
var projects = service.Projects.List().Execute();
C'est maintenant possible (j'ai utilisé la version 1.13.1.0 des API Google).
Exemple pour BigQuery:
GoogleCredential credential;
using (Stream stream = new FileStream(@"C:\mykey.json", FileMode.Open, FileAccess.Read, FileShare.Read))
{
credential = GoogleCredential.FromStream(stream);
}
string[] scopes = new string[] {
BigqueryService.Scope.Bigquery,
BigqueryService.Scope.CloudPlatform,
};
credential = credential.CreateScoped(scopes);
BaseClientService.Initializer initializer = new BaseClientService.Initializer()
{
HttpClientInitializer = (IConfigurableHttpClientInitializer)credential,
ApplicationName = "My Application",
GZipEnabled = true,
};
BigqueryService service = new BigqueryService(initializer);
Exemple pour Google Sheets:
GoogleCredential credential;
using (Stream stream = new FileStream(@"mykey.json", FileMode.Open, FileAccess.Read, FileShare.Read))
{
credential = GoogleCredential.FromStream(stream);
}
credential = credential.CreateScoped(new[] {
"https://spreadsheets.google.com/feeds",
"https://docs.google.com/feeds" });
string bearer;
try
{
Task<string> task = ((ITokenAccess)credential).GetAccessTokenForRequestAsync();
task.Wait();
bearer = task.Result;
}
catch (AggregateException ex)
{
throw ex.InnerException;
}
GDataRequestFactory requestFactory = new GDataRequestFactory("My Application");
requestFactory.CustomHeaders.Add(string.Format(CultureInfo.InvariantCulture, "Authorization: Bearer {0}", bearer));
SpreadsheetsService service = new SpreadsheetsService("My Application");
service.RequestFactory = requestFactory;
J'ai obtenu le lien indiquant que L'authentification du compte de service utilisant un fichier JSON dans l'application C # n'a pas encore été ajoutée à l'API Google BigQuery.
https://github.com/google/google-api-dotnet-client/issues/533
Cela fonctionne pour moi:
var scopes = new[] { DriveService.Scope.Drive };
ServiceAccountCredential credential;
using (Stream stream = new FileStream(@"C:\path\key.json", FileMode.Open, FileAccess.Read, FileShare.Read))
{
credential =
GoogleCredential.FromStream(stream).CreateScoped(scopes).UnderlyingCredential as
ServiceAccountCredential;
}
De toute évidence, vous fourniriez vos propres valeurs pour la variable scopes
et pour le chemin d'accès au fichier de clé. Vous devez également obtenir le package Google.Apis.Auth.OAuth2
Nuget ainsi que tout autre package spécifique au service avec lequel vous prévoyez d'utiliser les informations d'identification (dans mon cas, il s'agit de Google.Apis.Drive.v3
).