使用 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 分析网站的管理部分。授予它读取权限应该足够了。
我创建了一个控制台应用程序,它使用 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 分析网站的管理部分。授予它读取权限应该足够了。