How to use SpreadsheetsService authenticated by Se

2019-02-17 10:03发布

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?

2条回答
爱情/是我丢掉的垃圾
2楼-- · 2019-02-17 10:23

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;
查看更多
走好不送
3楼-- · 2019-02-17 10:25

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

查看更多
登录 后发表回答