Используйте API Google Analytics для отображения информации на С#
Я искал хорошее решение весь день, но google развивается так быстро, что я не могу найти что-то работающее. Что я хочу сделать, так это то, что у меня есть веб-приложение, в котором есть раздел администратора, в котором пользователю необходимо войти в систему, чтобы просмотреть информацию. В этом разделе я хочу показать некоторые данные из GA, например просмотры страниц для некоторых определенных URL-адресов. Поскольку это не информация пользователя, которую я показываю, но пользователь google analytics, я хочу подключить передачу информации (имя пользователя/пароль или APIKey), но я не могу узнать, как это сделать. Весь образец, который я нашел, использует OAuth2 (ведьма, если я понимаю, попросит посетителя войти в систему, используя Google).
Что я нашел до сих пор:
Может быть, я просто устал, и завтра будет легко найти решение, но сейчас мне нужна помощь!
Спасибо
Ответы
Ответ 1
Я много раз искал и, наконец, искал код из нескольких мест, а затем обернул свой собственный интерфейс вокруг него, я придумал следующее решение. Не уверен, что люди вставляют сюда весь свой код, но я думаю, почему бы не спасти все остальные:)
Предварительные требования, вам нужно будет установить пакет Google.GData.Client и google.gdata.analytics/dll.
Это основной класс, который выполняет эту работу.
namespace Utilities.Google
{
public class Analytics
{
private readonly String ClientUserName;
private readonly String ClientPassword;
private readonly String TableID;
private AnalyticsService analyticsService;
public Analytics(string user, string password, string table)
{
this.ClientUserName = user;
this.ClientPassword = password;
this.TableID = table;
// Configure GA API.
analyticsService = new AnalyticsService("gaExportAPI_acctSample_v2.0");
// Client Login Authorization.
analyticsService.setUserCredentials(ClientUserName, ClientPassword);
}
/// <summary>
/// Get the page views for a particular page path
/// </summary>
/// <param name="pagePath"></param>
/// <param name="startDate"></param>
/// <param name="endDate"></param>
/// <param name="isPathAbsolute">make this false if the pagePath is a regular expression</param>
/// <returns></returns>
public int GetPageViewsForPagePath(string pagePath, DateTime startDate, DateTime endDate, bool isPathAbsolute = true)
{
int output = 0;
// GA Data Feed query uri.
String baseUrl = "https://www.google.com/analytics/feeds/data";
DataQuery query = new DataQuery(baseUrl);
query.Ids = TableID;
//query.Dimensions = "ga:source,ga:medium";
query.Metrics = "ga:pageviews";
//query.Segment = "gaid::-11";
var filterPrefix = isPathAbsolute ? "ga:pagepath==" : "ga:pagepath=~";
query.Filters = filterPrefix + pagePath;
//query.Sort = "-ga:visits";
//query.NumberToRetrieve = 5;
query.GAStartDate = startDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
query.GAEndDate = endDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
Uri url = query.Uri;
DataFeed feed = analyticsService.Query(query);
output = Int32.Parse(feed.Aggregates.Metrics[0].Value);
return output;
}
public Dictionary<string, int> PageViewCounts(string pagePathRegEx, DateTime startDate, DateTime endDate)
{
// GA Data Feed query uri.
String baseUrl = "https://www.google.com/analytics/feeds/data";
DataQuery query = new DataQuery(baseUrl);
query.Ids = TableID;
query.Dimensions = "ga:pagePath";
query.Metrics = "ga:pageviews";
//query.Segment = "gaid::-11";
var filterPrefix = "ga:pagepath=~";
query.Filters = filterPrefix + pagePathRegEx;
//query.Sort = "-ga:visits";
//query.NumberToRetrieve = 5;
query.GAStartDate = startDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
query.GAEndDate = endDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture);
Uri url = query.Uri;
DataFeed feed = analyticsService.Query(query);
var returnDictionary = new Dictionary<string, int>();
foreach (var entry in feed.Entries)
returnDictionary.Add(((DataEntry)entry).Dimensions[0].Value, Int32.Parse(((DataEntry)entry).Metrics[0].Value));
return returnDictionary;
}
}
}
И это интерфейс и реализация, которые я использую для ее завершения.
namespace Utilities
{
public interface IPageViewCounter
{
int GetPageViewCount(string relativeUrl, DateTime startDate, DateTime endDate, bool isPathAbsolute = true);
Dictionary<string, int> PageViewCounts(string pagePathRegEx, DateTime startDate, DateTime endDate);
}
public class GooglePageViewCounter : IPageViewCounter
{
private string GoogleUserName
{
get
{
return ConfigurationManager.AppSettings["googleUserName"];
}
}
private string GooglePassword
{
get
{
return ConfigurationManager.AppSettings["googlePassword"];
}
}
private string GoogleAnalyticsTableName
{
get
{
return ConfigurationManager.AppSettings["googleAnalyticsTableName"];
}
}
private Analytics analytics;
public GooglePageViewCounter()
{
analytics = new Analytics(GoogleUserName, GooglePassword, GoogleAnalyticsTableName);
}
#region IPageViewCounter Members
public int GetPageViewCount(string relativeUrl, DateTime startDate, DateTime endDate, bool isPathAbsolute = true)
{
int output = 0;
try
{
output = analytics.GetPageViewsForPagePath(relativeUrl, startDate, endDate, isPathAbsolute);
}
catch (Exception ex)
{
Logger.Error(ex);
}
return output;
}
public Dictionary<string, int> PageViewCounts(string pagePathRegEx, DateTime startDate, DateTime endDate)
{
var input = analytics.PageViewCounts(pagePathRegEx, startDate, endDate);
var output = new Dictionary<string, int>();
foreach (var item in input)
{
if (item.Key.Contains('&'))
{
string[] key = item.Key.Split(new char[] { '?', '&' });
string newKey = key[0] + "?" + key.FirstOrDefault(k => k.StartsWith("p="));
if (output.ContainsKey(newKey))
output[newKey] += item.Value;
else
output[newKey] = item.Value;
}
else
output.Add(item.Key, item.Value);
}
return output;
}
#endregion
}
}
И теперь все остальное - очевидный материал - вам нужно будет добавить значения web.config в конфигурацию вашего приложения или webconfig и вызвать IPageViewCounter.GetPageViewCount
Ответ 2
Это требует немного настройки на стороне google, но на самом деле это довольно просто. Я перечислим шаг за шагом.
Сначала вам нужно создать приложение в облачной консоли Google и включить API Google Analytics.
- Перейдите в http://code.google.com/apis/console
- Выберите раскрывающийся список и создайте проект, если у вас его еще нет.
- После создания проекта щелкните по службам
- Теперь включите API Google Analytics
Теперь, когда API Google Analytics включен, следующий шаг будет состоять в том, чтобы включить учетную запись службы для доступа к вашим профилям/сайтам аналитики. Учетная запись службы позволит вам войти в систему, не запрашивая у пользователя учетные данные.
- Перейдите в http://code.google.com/apis/console и выберите проект, который вы
созданный из раскрывающегося списка.
- Далее перейдите в раздел "Доступ к API" и нажмите кнопку "Создать другой клиентский идентификатор".
- В окне "Создать идентификатор клиента" выберите учетную запись службы и нажмите
создать идентификатор клиента.
- Загрузите открытый ключ для этой учетной записи, если он не запускает
загрузите автоматически. Вам понадобится это позже, когда вы
авторизации.
- Перед тем, как закрыть копию, автоматически создайте адрес электронной почты службы, который вам понадобится в следующем шаге. Электронная почта клиента выглядит как @developer.gserviceaccount.com
Теперь, когда у нас есть учетная запись службы, вам необходимо разрешить этой учетной записи службы получать доступ к вашим профилям/сайтам в Google Analytics.
- Войдите в Google Analytics.
- После входа в систему нажмите кнопку "Администратор" в правом верхнем углу
экран.
- В Admin нажмите на раскрывающийся список учетной записи и выберите учетную запись/сайт, на который вы хотите получить доступ к своей учетной записи службы, затем нажмите "Управление пользователями" в разделе учетной записи.
- Введите адрес электронной почты, который был создан для вашей учетной записи службы, и дайте ему прочитать и проанализировать разрешение.
- Повторите эти действия для любой другой учетной записи/сайта, к которому вы хотите, чтобы ваш сервис имел доступ.
Теперь, когда настройка выполняется для учетной записи службы для доступа к Google Analytics через API, мы можем начать код.
Получите этот пакет от NuGet:
Клиентская библиотека Google.Apis.Analytics.v3
Добавьте следующие данные:
using Google.Apis.Analytics.v3;
using Google.Apis.Analytics.v3.Data;
using Google.Apis.Services;
using System.Security.Cryptography.X509Certificates;
using Google.Apis.Auth.OAuth2;
using System.Collections.Generic;
using System.Linq;
Следует отметить некоторые вещи.
-
keyPath
- это путь к файлу ключа, который вы загрузили с расширением файла .p12.
-
accountEmailAddress
- это письмо api, которое мы получили ранее.
- Scope - это Enum в классе
Google.Apis.Analytics.v3.AnalyticService
, который определяет URL-адрес для авторизации (ex: AnalyticsService.Scope.AnalyticsReadonly
).
- Имя приложения - это имя по вашему выбору, которое сообщает google api, что к нему обращается (aka: это может быть то, что вы когда-либо выбираете).
Затем код для выполнения некоторых основных вызовов выглядит следующим образом.
public class GoogleAnalyticsAPI
{
public AnalyticsService Service { get; set; }
public GoogleAnalyticsAPI(string keyPath, string accountEmailAddress)
{
var certificate = new X509Certificate2(keyPath, "notasecret", X509KeyStorageFlags.Exportable);
var credentials = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(accountEmailAddress)
{
Scopes = new[] { AnalyticsService.Scope.AnalyticsReadonly }
}.FromCertificate(certificate));
Service = new AnalyticsService(new BaseClientService.Initializer()
{
HttpClientInitializer = credentials,
ApplicationName = "WorthlessVariable"
});
}
public AnalyticDataPoint GetAnalyticsData(string profileId, string[] dimensions, string[] metrics, DateTime startDate, DateTime endDate)
{
AnalyticDataPoint data = new AnalyticDataPoint();
if (!profileId.Contains("ga:"))
profileId = string.Format("ga:{0}", profileId);
//Make initial call to service.
//Then check if a next link exists in the response,
//if so parse and call again using start index param.
GaData response = null;
do
{
int startIndex = 1;
if (response != null && !string.IsNullOrEmpty(response.NextLink))
{
Uri uri = new Uri(response.NextLink);
var paramerters = uri.Query.Split('&');
string s = paramerters.First(i => i.Contains("start-index")).Split('=')[1];
startIndex = int.Parse(s);
}
var request = BuildAnalyticRequest(profileId, dimensions, metrics, startDate, endDate, startIndex);
response = request.Execute();
data.ColumnHeaders = response.ColumnHeaders;
data.Rows.AddRange(response.Rows);
} while (!string.IsNullOrEmpty(response.NextLink));
return data;
}
private DataResource.GaResource.GetRequest BuildAnalyticRequest(string profileId, string[] dimensions, string[] metrics,
DateTime startDate, DateTime endDate, int startIndex)
{
DataResource.GaResource.GetRequest request = Service.Data.Ga.Get(profileId, startDate.ToString("yyyy-MM-dd"),
endDate.ToString("yyyy-MM-dd"), string.Join(",", metrics));
request.Dimensions = string.Join(",", dimensions);
request.StartIndex = startIndex;
return request;
}
public IList<Profile> GetAvailableProfiles()
{
var response = Service.Management.Profiles.List("~all", "~all").Execute();
return response.Items;
}
public class AnalyticDataPoint
{
public AnalyticDataPoint()
{
Rows = new List<IList<string>>();
}
public IList<GaData.ColumnHeadersData> ColumnHeaders { get; set; }
public List<IList<string>> Rows { get; set; }
}
}
Другие ссылки, которые будут полезны:
Аналитический API-интерфейс API - API запросов из Интернета
Аналитический API Explorer версии 2 - API запросов из Интернета
Ссылка на параметры и показатели
Надеюсь, это поможет кому-то, кто пытается это сделать в будущем.
Ответ 3
Я надеялся просто добавить комментарий к ответу для бета-версии v3, но точки rep предотвращают это. Тем не менее, я думал, что было бы хорошо, если бы у других была такая информация, вот так вот:
using Google.Apis.Authentication.OAuth2;
using Google.Apis.Authentication.OAuth2.DotNetOpenAuth;
using System.Security.Cryptography.X509Certificates;
using Google.Apis.Services;
Эти пространства имен используются во всем коде в этом сообщении. Я всегда хотел, чтобы люди чаще публиковали пространства имен, я, кажется, трачу много времени на их поиск. Надеюсь, это сэкономит несколько человек на несколько минут работы.
Ответ 4
Я установил что-то очень похожее на вышеупомянутый ответ в пакете nuGet. Он делает следующее:
- подключается к "учетной записи службы", настроенной в консоли API
- Вытягивает любые данные Google Analytics, которые вы хотели бы
- отображает данные с помощью API графиков Google
и все это очень легко изменить. Вы можете увидеть больше здесь: https://www.nuget.org/packages/GoogleAnalytics.GoogleCharts.NET/.
Ответ 5
Этот ответ предназначен для тех из вас, кто хочет получить доступ к вашей собственной учетной записи Google Analytics и хочет использовать новый API отчетности Google Analytics v4.
Недавно я написал сообщение о том, как получить данные Google Analytics с помощью С#. Прочитайте там все подробности.
Сначала вам нужно выбрать между подключением к OAuth2 или учетной записи службы. Я предполагаю, что у вас есть учетная запись Google Analytics, поэтому вам нужно создать "ключ учетной записи службы" на странице Credentials Google API.
Как только вы его создадите, загрузите файл JSON и поместите его в свой проект (я поместил его в свою папку App_Data
).
Затем установите Google.Apis.AnalyticsReporting.v4 пакет Nuget. Также установите Newtonsoft Json.NET.
Включите этот класс в свой проект:
public class PersonalServiceAccountCred
{
public string type { get; set; }
public string project_id { get; set; }
public string private_key_id { get; set; }
public string private_key { get; set; }
public string client_email { get; set; }
public string client_id { get; set; }
public string auth_uri { get; set; }
public string token_uri { get; set; }
public string auth_provider_x509_cert_url { get; set; }
public string client_x509_cert_url { get; set; }
}
И вот что вы ждете: полный пример!
string keyFilePath = Server.MapPath("~/App_Data/Your-API-Key-Filename.json");
string json = System.IO.File.ReadAllText(keyFilePath);
var cr = JsonConvert.DeserializeObject(json);
var xCred = new ServiceAccountCredential(new ServiceAccountCredential.Initializer(cr.client_email)
{
Scopes = new[] {
AnalyticsReportingService.Scope.Analytics
}
}.FromPrivateKey(cr.private_key));
using (var svc = new AnalyticsReportingService(
new BaseClientService.Initializer
{
HttpClientInitializer = xCred,
ApplicationName = "[Your Application Name]"
})
)
{
// Create the DateRange object.
DateRange dateRange = new DateRange() { StartDate = "2017-05-01", EndDate = "2017-05-31" };
// Create the Metrics object.
Metric sessions = new Metric { Expression = "ga:sessions", Alias = "Sessions" };
//Create the Dimensions object.
Dimension browser = new Dimension { Name = "ga:browser" };
// Create the ReportRequest object.
ReportRequest reportRequest = new ReportRequest
{
ViewId = "[A ViewId in your account]",
DateRanges = new List() { dateRange },
Dimensions = new List() { browser },
Metrics = new List() { sessions }
};
List requests = new List();
requests.Add(reportRequest);
// Create the GetReportsRequest object.
GetReportsRequest getReport = new GetReportsRequest() { ReportRequests = requests };
// Call the batchGet method.
GetReportsResponse response = svc.Reports.BatchGet(getReport).Execute();
}
Мы начинаем с десериализации информации ключа учетной записи службы из файла JSON и преобразования ее в объект PersonalServiceAccountCred
. Затем мы создаем ServiceAccountCredential
и подключаемся к Google через AnalyticsReportingService
. Используя эту услугу, мы затем готовим некоторые базовые фильтры для перехода к API и отправки запроса.
Вероятно, лучше всего установить точку останова в строке, где объявлена переменная response
, нажать F10 один раз, затем навести курсор на переменную, чтобы вы могли видеть, какие данные доступны для использования в ответе.
Ответ 6
Надеюсь, Google когда-нибудь предоставит надлежащую документацию. Здесь я перечисляю все шаги по интеграции аутентификации на стороне сервера Google Analytics в ASP.NET С#.
Шаг 1. Создание проекта в консоли Google
Перейдите к ссылке https://console.developers.google.com/iam-admin/projects и создайте проект, нажав кнопку "Создать проект" и укажите имя проекта во всплывающем окне и отправьте его.
Шаг 2. Создание учетных данных и учетной записи службы
После создания проекта вы будете перенаправлены на страницу "Менеджер API".
Нажмите учетные данные и нажмите кнопку "Создать учетные данные". выберите "ключ учетной записи службы" из раскрывающегося списка, который будет перенаправлен на следующую страницу.
В раскрывающемся списке "Сервис" выберите "Новая учетная запись службы". Заполните имя учетной записи службы и загрузите ключ p12. Он будет иметь расширение p12. вы получите всплывающее окно с паролем " notasecret", который по умолчанию, и ваш личный ключ будет загружен.
Шаг 3: Создайте идентификатор клиента 0auth
нажмите на раскрывающийся список "создать учетные данные" и выберите "Идентификатор клиента 0auth", вы будете перенаправлены на вкладку "Дать согласие". укажите случайное имя в текстовом поле имени проекта. выберите тип приложения как "Веб-приложение" и нажмите кнопку "Создать". Скопируйте сгенерированный идентификатор клиента в блокнот.
Шаг 4: Включите API
С левой стороны перейдите на вкладку "Обзор" и выберите "Включенные API" из горизонтальной вкладки. В строке поиска найдите "API Google Analytics", нажмите на раскрывающийся список и нажмите кнопку "Включить". Теперь снова найдите "Отчетность по аналитикам V4" и включите его.
Шаг 5: Установите пакеты nuget
В visual studio откройте "Инструменты" > "Диспетчер пакетов Nuget" > "Менеджер пакетов".
Скопируйте вставьте следующий код в консоли, чтобы установить пакеты nuget.
Установочный пакет Google.Apis.Analytics.v3
Install-Package DotNetOpenAuth.Core -Version 4.3.4.13329
Два вышеуказанных пакета - это Google Analytics и пакеты DotNetOpenAuth nuget.
Шаг 6: Предоставление разрешения "Просмотр и анализ" учетной записи службы
Перейдите в учетную запись Google Analytics и перейдите на вкладку "Администратор" и выберите "Управление пользователями" в левом меню, выберите домен, к которому вы хотите получить доступ к данным аналитики, и вставьте в него идентификатор электронной почты учетной записи службы и выберите "Чтение и Анализировать" разрешение из раскрывающегося списка. Идентификатор электронной почты учетной записи службы выглядит так: [email protected]
Рабочий код
КОД FRONT END:
Скопируйте и вставьте приведенную ниже аналитику embed script в свой интерфейс, иначе вы также сможете получить этот код с страницы документации Google Analytics.
<script>
(function (w, d, s, g, js, fs) {
g = w.gapi || (w.gapi = {}); g.analytics = { q: [], ready: function (f) { this.q.push(f); } };
js = d.createElement(s); fs = d.getElementsByTagName(s)[0];
js.src = 'https://apis.google.com/js/platform.js';
fs.parentNode.insertBefore(js, fs); js.onload = function () { g.load('analytics'); };
}(window, document, 'script'));</script>
Вставьте приведенный ниже код в тег тела вашей передней страницы.
<asp:HiddenField ID="accessToken" runat="server" />
<div id="chart-1-container" style="width:600px;border:1px solid #ccc;"></div>
<script>
var access_token = document.getElementById('<%= accessToken.ClientID%>').value;
gapi.analytics.ready(function () {
/**
* Authorize the user with an access token obtained server side.
*/
gapi.analytics.auth.authorize({
'serverAuth': {
'access_token': access_token
}
});
/**
* Creates a new DataChart instance showing sessions.
* It will be rendered inside an element with the id "chart-1-container".
*/
var dataChart1 = new gapi.analytics.googleCharts.DataChart({
query: {
'ids': 'ga:53861036', // VIEW ID <-- Goto your google analytics account and select the domain whose analytics data you want to display on your webpage. From the URL ex: a507598w53044903p53861036. Copy the digits after "p". It is your view ID
'start-date': '2016-04-01',
'end-date': '2016-04-30',
'metrics': 'ga:sessions',
'dimensions': 'ga:date'
},
chart: {
'container': 'chart-1-container',
'type': 'LINE',
'options': {
'width': '100%'
}
}
});
dataChart1.execute();
/**
* Creates a new DataChart instance showing top 5 most popular demos/tools
* amongst returning users only.
* It will be rendered inside an element with the id "chart-3-container".
*/
});
</script>
Вы также можете получить свой идентификатор вида https://ga-dev-tools.appspot.com/account-explorer/
BACK END CODE:
using System;
using System.Linq;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Web.Script.Serialization;
using System.Net;
using System.Text;
using Google.Apis.Analytics.v3;
using Google.Apis.Analytics.v3.Data;
using Google.Apis.Services;
using System.Security.Cryptography.X509Certificates;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Util;
using DotNetOpenAuth.OAuth2;
using System.Security.Cryptography;
namespace googleAnalytics
{
public partial class api : System.Web.UI.Page
{
public const string SCOPE_ANALYTICS_READONLY = "https://www.googleapis.com/auth/analytics.readonly";
string ServiceAccountUser = "[email protected]"; //service account email ID
string keyFile = @"D:\key.p12"; //file link to downloaded key with p12 extension
protected void Page_Load(object sender, EventArgs e)
{
string Token = Convert.ToString(GetAccessToken(ServiceAccountUser, keyFile, SCOPE_ANALYTICS_READONLY));
accessToken.Value = Token;
var certificate = new X509Certificate2(keyFile, "notasecret", X509KeyStorageFlags.Exportable);
var credentials = new ServiceAccountCredential(
new ServiceAccountCredential.Initializer(ServiceAccountUser)
{
Scopes = new[] { AnalyticsService.Scope.AnalyticsReadonly }
}.FromCertificate(certificate));
var service = new AnalyticsService(new BaseClientService.Initializer()
{
HttpClientInitializer = credentials,
ApplicationName = "Google Analytics API"
});
string profileId = "ga:53861036";
string startDate = "2016-04-01";
string endDate = "2016-04-30";
string metrics = "ga:sessions,ga:users,ga:pageviews,ga:bounceRate,ga:visits";
DataResource.GaResource.GetRequest request = service.Data.Ga.Get(profileId, startDate, endDate, metrics);
GaData data = request.Execute();
List<string> ColumnName = new List<string>();
foreach (var h in data.ColumnHeaders)
{
ColumnName.Add(h.Name);
}
List<double> values = new List<double>();
foreach (var row in data.Rows)
{
foreach (var item in row)
{
values.Add(Convert.ToDouble(item));
}
}
values[3] = Math.Truncate(100 * values[3]) / 100;
txtSession.Text = values[0].ToString();
txtUsers.Text = values[1].ToString();
txtPageViews.Text = values[2].ToString();
txtBounceRate.Text = values[3].ToString();
txtVisits.Text = values[4].ToString();
}
public static dynamic GetAccessToken(string clientIdEMail, string keyFilePath, string scope)
{
// certificate
var certificate = new X509Certificate2(keyFilePath, "notasecret");
// header
var header = new { typ = "JWT", alg = "RS256" };
// claimset
var times = GetExpiryAndIssueDate();
var claimset = new
{
iss = clientIdEMail,
scope = scope,
aud = "https://accounts.google.com/o/oauth2/token",
iat = times[0],
exp = times[1],
};
JavaScriptSerializer ser = new JavaScriptSerializer();
// encoded header
var headerSerialized = ser.Serialize(header);
var headerBytes = Encoding.UTF8.GetBytes(headerSerialized);
var headerEncoded = Convert.ToBase64String(headerBytes);
// encoded claimset
var claimsetSerialized = ser.Serialize(claimset);
var claimsetBytes = Encoding.UTF8.GetBytes(claimsetSerialized);
var claimsetEncoded = Convert.ToBase64String(claimsetBytes);
// input
var input = headerEncoded + "." + claimsetEncoded;
var inputBytes = Encoding.UTF8.GetBytes(input);
// signature
var rsa = certificate.PrivateKey as RSACryptoServiceProvider;
var cspParam = new CspParameters
{
KeyContainerName = rsa.CspKeyContainerInfo.KeyContainerName,
KeyNumber = rsa.CspKeyContainerInfo.KeyNumber == KeyNumber.Exchange ? 1 : 2
};
var aescsp = new RSACryptoServiceProvider(cspParam) { PersistKeyInCsp = false };
var signatureBytes = aescsp.SignData(inputBytes, "SHA256");
var signatureEncoded = Convert.ToBase64String(signatureBytes);
// jwt
var jwt = headerEncoded + "." + claimsetEncoded + "." + signatureEncoded;
var client = new WebClient();
client.Encoding = Encoding.UTF8;
var uri = "https://accounts.google.com/o/oauth2/token";
var content = new NameValueCollection();
content["assertion"] = jwt;
content["grant_type"] = "urn:ietf:params:oauth:grant-type:jwt-bearer";
string response = Encoding.UTF8.GetString(client.UploadValues(uri, "POST", content));
var result = ser.Deserialize<dynamic>(response);
object pulledObject = null;
string token = "access_token";
if (result.ContainsKey(token))
{
pulledObject = result[token];
}
//return result;
return pulledObject;
}
private static int[] GetExpiryAndIssueDate()
{
var utc0 = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc);
var issueTime = DateTime.UtcNow;
var iat = (int)issueTime.Subtract(utc0).TotalSeconds;
var exp = (int)issueTime.AddMinutes(55).Subtract(utc0).TotalSeconds;
return new[] { iat, exp };
}
}
}
Ответ 7
Другой рабочий подход
Добавьте нижеприведенный код в ConfigAuth
var googleApiOptions = new GoogleOAuth2AuthenticationOptions()
{
AccessType = "offline", // can use only if require
ClientId = ClientId,
ClientSecret = ClientSecret,
Provider = new GoogleOAuth2AuthenticationProvider()
{
OnAuthenticated = context =>
{
context.Identity.AddClaim(new Claim("Google_AccessToken", context.AccessToken));
if (context.RefreshToken != null)
{
context.Identity.AddClaim(new Claim("GoogleRefreshToken", context.RefreshToken));
}
context.Identity.AddClaim(new Claim("GoogleUserId", context.Id));
context.Identity.AddClaim(new Claim("GoogleTokenIssuedAt", DateTime.Now.ToBinary().ToString()));
var expiresInSec = 10000;
context.Identity.AddClaim(new Claim("GoogleTokenExpiresIn", expiresInSec.ToString()));
return Task.FromResult(0);
}
},
SignInAsAuthenticationType = DefaultAuthenticationTypes.ApplicationCookie
};
googleApiOptions.Scope.Add("openid"); // Need to add for google+
googleApiOptions.Scope.Add("profile");// Need to add for google+
googleApiOptions.Scope.Add("email");// Need to add for google+
googleApiOptions.Scope.Add("https://www.googleapis.com/auth/analytics.readonly");
app.UseGoogleAuthentication(googleApiOptions);
Добавьте ниже код, пространства имен и относительные ссылки
using Google.Apis.Analytics.v3;
using Google.Apis.Analytics.v3.Data;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Auth.OAuth2.Flows;
using Google.Apis.Auth.OAuth2.Responses;
using Google.Apis.Services;
using Microsoft.AspNet.Identity;
using Microsoft.Owin.Security;
using System;
using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
public class HomeController : Controller
{
AnalyticsService service;
public IAuthenticationManager AuthenticationManager
{
get
{
return HttpContext.GetOwinContext().Authentication;
}
}
public async Task<ActionResult> AccountList()
{
service = new AnalyticsService(new BaseClientService.Initializer()
{
HttpClientInitializer = await GetCredentialForApiAsync(),
ApplicationName = "Analytics API sample",
});
//Account List
ManagementResource.AccountsResource.ListRequest AccountListRequest = service.Management.Accounts.List();
//service.QuotaUser = "MyApplicationProductKey";
Accounts AccountList = AccountListRequest.Execute();
return View();
}
private async Task<UserCredential> GetCredentialForApiAsync()
{
var initializer = new GoogleAuthorizationCodeFlow.Initializer
{
ClientSecrets = new ClientSecrets
{
ClientId = ClientId,
ClientSecret = ClientSecret,
},
Scopes = new[] { "https://www.googleapis.com/auth/analytics.readonly" }
};
var flow = new GoogleAuthorizationCodeFlow(initializer);
var identity = await AuthenticationManager.GetExternalIdentityAsync(DefaultAuthenticationTypes.ApplicationCookie);
if (identity == null)
{
Redirect("/Account/Login");
}
var userId = identity.FindFirstValue("GoogleUserId");
var token = new TokenResponse()
{
AccessToken = identity.FindFirstValue("Google_AccessToken"),
RefreshToken = identity.FindFirstValue("GoogleRefreshToken"),
Issued = DateTime.FromBinary(long.Parse(identity.FindFirstValue("GoogleTokenIssuedAt"))),
ExpiresInSeconds = long.Parse(identity.FindFirstValue("GoogleTokenExpiresIn")),
};
return new UserCredential(flow, userId, token);
}
}
Добавьте это в Application_Start() в Global.asax
AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;