Пример #1
0
 public static string GetAuthFilePath(AuthAccountType useServiceAccount = AuthAccountType.Service)
 {
     try
     {
         if (useServiceAccount == AuthAccountType.Service)
         {
             return(Path.Combine(AuthFolder(), SERVICE_ACCOUNT_KEYFILE));
         }
         else
         {
             return(Path.Combine(AuthFolder(), JCUBIC_WEB_APP_KEYFILE));
         }
     }
     catch
     {
     }
     return(string.Empty);
 }
Пример #2
0
        public static string GetClientEmail(AuthAccountType useServiceAccount = AuthAccountType.Service)
        {
            try
            {
                string authFilePath = GetAuthFilePath(useServiceAccount);
                using (StreamReader sr = File.OpenText(authFilePath))
                {
                    string content = sr.ReadToEnd();
                    return(ParseValue(content, "\"client_email\":"));

                    // TODO: the following code only work for one-level json
                    //var dict = JsonConvert.DeserializeObject<Dictionary<string, string>>(content);
                    //return dict["client_email"];
                }
            }
            catch
            {
            }
            return(string.Empty);
        }
Пример #3
0
        public static DriveService GetDriveService(AuthAccountType useServiceAccount = AuthAccountType.Service)
        {
            if (_driveService != null)
            {
                return(_driveService);
            }
            try
            {
                string   ApplicationName = GetApplicationName(AuthAccountType.Developer);
                string[] scopes          = { DriveService.Scope.Drive };

                if (useServiceAccount == AuthAccountType.Service)
                {
                    var serviceAccountEmail = GetClientEmail(AuthAccountType.Service);
                    var x509File            = SERVICE_ACCOUNT_KEYFILE;
                    var certificate         = new X509Certificate2(x509File, "notasecret", X509KeyStorageFlags.Exportable);
                    var serviceAccountCredentialInitializer =
                        new ServiceAccountCredential
                        .Initializer(serviceAccountEmail)
                    {
                        Scopes = scopes
                    }
                    .FromCertificate(certificate);

                    var credential = new ServiceAccountCredential(serviceAccountCredentialInitializer);

                    if (!credential.RequestAccessTokenAsync(CancellationToken.None).Result)
                    {
                        throw new InvalidOperationException("Access token request failed.");
                    }

                    DriveService service = new DriveService(new BaseClientService.Initializer()
                    {
                        HttpClientInitializer = credential,
                        ApplicationName       = ApplicationName,
                    });

                    return(_driveService = service);
                }
                else
                {
                    string secretFile = GetAuthFilePath();

                    UserCredential credential;

                    using (var stream = new FileStream(secretFile, FileMode.Open, FileAccess.Read))
                    {
                        //string credPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.Personal);
                        // token folder to store user Oauth access token
                        string credPath = Path.Combine(AuthFolder(), GOOGLE_DRIVE_TOKEN_FOLDER);

                        //string userId = ClaimProvider.GetUserId(_dbContext).Replace("-", string.Empty);
                        string userId = ClaimsPrincipal.Current.Identity.Name.Split(new char[] { '@' }, StringSplitOptions.RemoveEmptyEntries)[0];

                        DojoLogger.Info(string.Format("credential folder={0} for user {1}", credPath, ClaimsPrincipal.Current.Identity.Name));

                        // save credential file to credPath
                        GoogleWebAuthorizationBroker.Folder = credPath;
                        credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                            GoogleClientSecrets.Load(stream).Secrets,
                            scopes,
                            userId,
                            CancellationToken.None,
                            new FileDataStore(credPath, true))
                                     .Result;
                    }

                    // Create Google Drive API service
                    var service = new DriveService(new BaseClientService.Initializer()
                    {
                        HttpClientInitializer = credential,
                        ApplicationName       = ApplicationName,
                    });

                    DojoLogger.Info("Drive service created.");

                    return(_driveService = service);
                }
            }
            catch (Exception ex)
            {
                DojoLogger.Error(ex.Message);
                return(null);
            }
        }
Пример #4
0
        public static SpreadsheetsService GetSpreadsheetService(AuthAccountType useServiceAccount = AuthAccountType.Service)
        {
            if (_driveService != null)
            {
                return(_sheetervice);
            }
            try
            {
                string   ApplicationName = GetApplicationName(AuthAccountType.Developer);
                string[] scopes          = { SheetsService.Scope.Drive, SheetsService.Scope.Spreadsheets };

                if (useServiceAccount == AuthAccountType.Service)
                {
                    var serviceAccountEmail = GetClientEmail(AuthAccountType.Service);
                    var x509File            = SERVICE_ACCOUNT_KEYFILE;
                    var certificate         = new X509Certificate2(x509File, "notasecret", X509KeyStorageFlags.Exportable);

                    var serviceAccountCredentialInitializer = new ServiceAccountCredential
                                                              .Initializer(serviceAccountEmail)
                    {
                        Scopes = scopes
                    }
                    .FromCertificate(certificate);

                    var credential = new ServiceAccountCredential(serviceAccountCredentialInitializer);

                    if (!credential.RequestAccessTokenAsync(CancellationToken.None).Result)
                    {
                        throw new InvalidOperationException("Access token request failed.");
                    }

                    var requestFactory = new GDataRequestFactory(null);
                    requestFactory.CustomHeaders.Add("Authorization: Bearer " + credential.Token.AccessToken);

                    var service = new SpreadsheetsService(ApplicationName)
                    {
                        RequestFactory = requestFactory
                    };

                    return(_sheetervice = service);
                }
                else
                {
                    string[] Scopes     = { SheetsService.Scope.SpreadsheetsReadonly };
                    string   secretFile = GetAuthFilePath();

                    UserCredential credential;

                    using (var stream = new FileStream(secretFile, FileMode.Open, FileAccess.Read))
                    {
                        string credPath = GetAuthFilePath();
                        credPath = Path.Combine(AuthFolder(), GOOGLE_DRIVE_TOKEN_FOLDER);

                        string userId = ClaimsPrincipal.Current.Identity.Name.Split(new char[] { '@' }, StringSplitOptions.RemoveEmptyEntries)[0];

                        // save credential file to credPath
                        credential = GoogleWebAuthorizationBroker.AuthorizeAsync(
                            GoogleClientSecrets.Load(stream).Secrets,
                            Scopes,
                            "user",
                            CancellationToken.None,
                            new FileDataStore(credPath, true)).Result;
                    }

                    //var service = new SheetsService(new BaseClientService.Initializer()
                    //{
                    //    HttpClientInitializer = credential,
                    //    ApplicationName = ApplicationName,
                    //});

                    var requestFactory = new GDataRequestFactory(null);
                    requestFactory.CustomHeaders.Add("Authorization: Bearer " + credential.Token.AccessToken);

                    // Create Google Sheets API service
                    var service = new SpreadsheetsService(ApplicationName)
                    {
                        RequestFactory = requestFactory
                    };

                    return(_sheetervice = service);
                }
            }
            catch (Exception ex)
            {
                DojoLogger.Error(ex.Message);
                return(null);
            }
        }