Диск Google - измените общую таблицу без oauth

Я хочу редактировать общую таблицу на Google Диске программно. Я использую C#

Когда пользователь нажимает кнопку, мой код должен использовать учетную запись компании dev + пароль для доступа к электронной таблице на диске Google и обновления поля даты. Это все, что нужно сделать.

Мне кажется, что oAuth требует, чтобы пользователь сам прошел аутентификацию в Google, или, по крайней мере, такое впечатление я получаю от Google.Apis.Auth.OAuth2AuthorizeAsync().

    //
    // Summary:
    //     Asynchronously authorizes the specified user. Requires user interaction; see
    //     Google.Apis.Auth.OAuth2.GoogleWebAuthorizationBroker remarks for more details.
    //

Это не то, что мне нужно или нужно, но документация вокруг этого кажется совершенно непрозрачной... Может быть, я что-то здесь упускаю? Кто-нибудь знает другой способ сделать это?

1 ответ

Решение

Для того, чтобы обновить что-либо, вам необходимо пройти аутентификацию, даже если лист открыт для общего доступа, и любой может получить к нему доступ. Программно говоря, вам все еще нужно пройти аутентификацию.

То, что вы должны посмотреть на использование это служебная учетная запись. Учетные записи служб похожи на фиктивных пользователей, если вы предоставили доступ к листу учетной записи службы, используя адрес электронной почты учетной записи. Затем он будет иметь доступ к листу без необходимости аутентификации.

public static class ServiceAccountExample
{

    /// <summary>
    /// Authenticating to Google using a Service account
    /// Documentation: https://developers.google.com/accounts/docs/OAuth2#serviceaccount
    /// </summary>
    /// <param name="serviceAccountEmail">From Google Developer console https://console.developers.google.com</param>
    /// <param name="serviceAccountCredentialFilePath">Location of the .p12 or Json Service account key file downloaded from Google Developer console https://console.developers.google.com</param>
    /// <returns>AnalyticsService used to make requests against the Analytics API</returns>
    public static SheetsService AuthenticateServiceAccount(string serviceAccountEmail, string serviceAccountCredentialFilePath, string[] scopes)
    {
        try
        {
            if (string.IsNullOrEmpty(serviceAccountCredentialFilePath))
                throw new Exception("Path to the service account credentials file is required.");
            if (!File.Exists(serviceAccountCredentialFilePath))
                throw new Exception("The service account credentials file does not exist at: " + serviceAccountCredentialFilePath);
            if (string.IsNullOrEmpty(serviceAccountEmail))
                throw new Exception("ServiceAccountEmail is required.");                

            // For Json file
            if (Path.GetExtension(serviceAccountCredentialFilePath).ToLower() == ".json")
            {
                GoogleCredential credential;
                using (var stream = new FileStream(serviceAccountCredentialFilePath, FileMode.Open, FileAccess.Read))
                {
                    credential = GoogleCredential.FromStream(stream)
                         .CreateScoped(scopes);
                }

                // Create the  Analytics service.
                return new SheetsService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Sheets Service account Authentication Sample",
                });
            }
            else if (Path.GetExtension(serviceAccountCredentialFilePath).ToLower() == ".p12")
            {   // If its a P12 file

                var certificate = new X509Certificate2(serviceAccountCredentialFilePath, "notasecret", X509KeyStorageFlags.MachineKeySet | X509KeyStorageFlags.Exportable);
                var credential = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(serviceAccountEmail)
                {
                    Scopes = scopes
                }.FromCertificate(certificate));

                // Create the  Sheets service.
                return new SheetsService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "Sheets Authentication Sample",
                });
            }
            else
            {
                throw new Exception("Unsupported Service accounts credentials.");
            }

        }
        catch (Exception ex)
        {                
            throw new Exception("CreateServiceAccountSheetsFailed", ex);
        }
    }
}

код скопирован из моего примера проекта ServiceAccount.cs

Другие вопросы по тегам