使用 OAuth2 在 C# 中使用 Google API 进行身份验证

Using OAuth2 to Authenticate with a Google API in C#

我创建了一个控制台应用程序,它使用 OAuth2 通过 GoogleAnalyticsApiV4 进行身份验证以查询一些数据。该应用程序按预期工作,但我们希望自动化该过程,以便可以将应用程序安排为每天 运行 一次。这里的问题是应用程序将托管在 azure 上,用户无法接受第一次应用程序 运行s 时在浏览器中弹出的带有 google 的身份验证请求。

以下在线帖子和 googles 文档我当前的身份验证解决方案是这个

     try
        {
            var credential = GetCredential().Result;

            using (var svc = new AnalyticsReportingService(
            new BaseClientService.Initializer
            {
                HttpClientInitializer = credential,
                ApplicationName = "Google Analytics API Console"
            }))
        {
           ///// Query some data/////
        } 



static async Task<UserCredential> GetCredential()
{
    using (var stream = new FileStream("client_secret.json",
         FileMode.Open, FileAccess.Read))
    {
        string loginEmailAddress = ConfigurationManager.AppSettings["GoogleUsername"];
        return await GoogleWebAuthorizationBroker.AuthorizeAsync(
            GoogleClientSecrets.Load(stream).Secrets,
            new[] { AnalyticsReportingService.Scope.Analytics },
            loginEmailAddress, CancellationToken.None,
            new FileDataStore("GoogleAnalyticsApiConsole"));
    }
}

只要用户可以输入凭据并接受身份验证请求,此解决方案就可以很好地使用 Google 进行身份验证。不幸的是,一旦应用程序移动到另一台机器,它就需要重新进行身份验证,并且用户需要再次输入凭据并接受请求。

我一直在寻找一种方法让用户退出进程,以便应用程序可以 运行 在 azure 上,但没有找到任何关于如何在 c# 中执行此操作的明确信息。

有人可以描述我如何在没有用户的情况下使用 google 验证我的应用程序,或者为我指出准确涵盖该过程的文档方向。

非常感谢您的帮助或示例。

你有几个选择。

这是您有权访问的帐户吗?如果是,那么您可以使用服务帐户。服务帐户是预授权的,您使用服务帐户电子邮件地址并将其添加为帐户级别的 Google 分析管理员中的用户,并且服务帐户将能够访问该帐户,只要它有效。不需要弹出 window。我有一些关于如何使用服务帐户进行身份验证的示例代码 here

/// <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 AnalyticsReportingService AuthenticateServiceAccount(string serviceAccountEmail, string serviceAccountCredentialFilePath)
    {
        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.");

            // These are the scopes of permissions you need. It is best to request only what you need and not all of them
            string[] scopes = new string[] { AnalyticsReportingService.Scope.Analytics };             // View your Google Analytics data

            // 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 AnalyticsReportingService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "AnalyticsReporting 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  AnalyticsReporting service.
                return new AnalyticsReportingService(new BaseClientService.Initializer()
                {
                    HttpClientInitializer = credential,
                    ApplicationName = "AnalyticsReporting Authentication Sample",
                });
            }
            else
            {
                throw new Exception("Unsupported Service accounts credentials.");
            }

        }
        catch (Exception ex)
        {
            Console.WriteLine("Create service account AnalyticsReportingService failed" + ex.Message);
            throw new Exception("CreateServiceAccountAnalyticsReportingFailed", ex);
        }
    }

如果这不是您可以做的事情。那么您应该知道 filedatastore() 默认情况下将您的凭据存储在 %appData% 中,您只需将该文件连同代码一起复制到新服务器上即可。

您还可以使用以下代码将位置移动到 %appData% 以外的位置:

new FileDataStore(@"c:\datastore",true)     

我有一个关于文件数据存储如何工作的教程。这里File datastore demystified

向 Google Analytics 预授权服务帐户。 Google 分析网站的管理部分。授予它读取权限应该足够了。