I need to use SpreadsheetsService, but I don't find the way in the official documentation .net.
https://developers.google.com/google-apps/spreadsheets/?hl=ja#authorizing_requests
I have my service authenticated:
String serviceAccountEmail = "serviceAccount@developer.gserviceaccount.com";
var certificate = new X509Certificate2(@"privatekey.p12", "pass", X509KeyStorageFlags.Exportable);
ServiceAccountCredential credential = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
Scopes = new[] { DriveService.Scope.Drive }
}.FromCertificate(certificate));
From here I can instantiate almost any service.
For example Drive Service:
var service = new DriveService(new BaseClientService.Initializer()
{
HttpClientInitializer = credential,
ApplicationName = "Drive API Sample",
});
But with SpreadsheetsService I can do this, because SpreadsheetsService wait for an string 'application name' in his default constructor or an GOAuth2RequestFactory in his property RequestFactory.
How to authenticate SpreadsheetsService with an ServiceAccountCredential?
Here is the answer on how to do this..... The key is to use the customHeaders on a new requestFactory
var certificate = new
System.Security.Cryptography.X509Certificates.X509Certificate2(p12KeyFileName,
"notasecret", X509KeyStorageFlags.Exportable);
string SCOPE = "https://spreadsheets.google.com/feeds
https://docs.google.com/feeds";
Google.Apis.Auth.OAuth2.ServiceAccountCredential credential = new
Google.Apis.Auth.OAuth2.ServiceAccountCredential(
new ServiceAccountCredential.Initializer(serviceAccountEmail)
{
Scopes = new[] { SCOPE }
}.FromCertificate(certificate));
bool success =
credential.RequestAccessTokenAsync(System.Threading.CancellationToken.None).Result;
var requestFactory = new Google.GData.Client.GDataRequestFactory("My
Plastic SCM Service");
requestFactory.CustomHeaders.Add(string.Format("Authorization: Bearer
{0}", credential.Token.AccessToken));
var s = new
SpreadsheetsService("MySpreadsheetIntegration-v1"); s.RequestFactory =
requestFactory;
return s;
Note that when adding the custom header you need: "Authorization: Bearer {0}" <-- with a space between "Bearer" and "{0}" Because: "Authorization: Bearer{0}" <-- no space will only get you an "unknown authorization header" Error 401 response
来源:https://stackoverflow.com/questions/24185206/how-to-use-spreadsheetsservice-authenticated-by-serviceaccountcredential