Jak korzystać z konta usługi, aby uzyskać dostęp do interfejsu Google Analytics API V3 z .NET C #?

Zdałem sobie sprawę, że to pytanie zostało już wcześniej zadane, ale z niewielką ilością przykładowego kodu, więc pytam ponownie, ale przynajmniej z pewnym kierunkiem.

Po godzinach poszukiwań wymyśliłem następującą częściową implementację.

namespace GoogleAnalyticsAPITest.Console
{
    using System.Security.Cryptography.X509Certificates;
    using DotNetOpenAuth.OAuth2;
    using Google.Apis.Analytics.v3;
    using Google.Apis.Analytics.v3.Data;
    using Google.Apis.Authentication.OAuth2;
    using Google.Apis.Authentication.OAuth2.DotNetOpenAuth;

    class Program
    {
        static void Main(string[] args)
        {
            log4net.Config.XmlConfigurator.Configure();
            string Scope = Google.Apis.Analytics.v3.AnalyticsService.Scopes.Analytics.ToString().ToLower();
            string scopeUrl = "https://www.googleapis.com/auth/" + Scope;
            const string ServiceAccountId = "nnnnnnnnnnn.apps.googleusercontent.com";
            const string ServiceAccountUser = "[email protected]";
            AssertionFlowClient client = new AssertionFlowClient(
                GoogleAuthenticationServer.Description, new X509Certificate2(@"7039572692013fc5deada350904f55bad2588a2a-privatekey.p12", "notasecret", X509KeyStorageFlags.Exportable))
            {
                Scope = scopeUrl,
                ServiceAccountId = ServiceAccountId//,ServiceAccountUser = ServiceAccountUser
            };
            IAuthorizationState state = AssertionFlowClient.GetState(client);
            AnalyticsService service = new AnalyticsService(authenticator);
            string profileId = "ga:xxxxxxxx";
            string startDate = "2010-10-01";
            string endDate = "2010-10-18";
            string metrics = "ga:visits";
            DataResource.GaResource.GetRequest request = service.Data.Ga.Get(profileId, startDate, endDate, metrics);
            request.Dimensions = "ga:date";
            GaData data = request.Fetch();
        }
    }
}

Mam kilka problemów. Wezwanie doAssertionFlowClient.GetState(client) powoduje odpowiedź „invalid_scope” widoczną w dzienniku DotNetOpenAuth w

2012-10-19 13: 27: 36 272 (GMT-4) [8] INFO DotNetOpenAuth - DotNetOpenAuth, wersja = 4.0.0.11165, Culture = neutralny, PublicKeyToken = 2780ccd10d57b246 (oficjalny) 2012-10-19 13: 27: 36 284 ( GMT-4) [8] DEBUG DotNetOpenAuth.Messaging.Channel - Przygotowanie do wysłania komunikatu AssertionFlowMessage (2.0). 2012-10-19 13: 27: 36 294 (GMT-4) [8] INFO DotNetOpenAuth.Messaging.Channel - Przygotowany wychodzący komunikat AssertionFlowMessage (2.0) dlahttps://accounts.google.com/o/oauth2/token: typ_ grantu: asercja assertion_type:http://oauth.net/grant_type/jwt/1.0/bearer asercja: (tutaj jest kilka zakodowanych znaków)

2012-10-19 13: 27: 36 296 (GMT-4) [8] DEBUG DotNetOpenAuth.Messaging.Channel - Wysyłanie żądania AssertionFlowMessage. 2012-10-19 13: 27: 36,830 (GMT-4) [8] DEBUG DotNetOpenAuth.Http - HTTP POSThttps://accounts.google.com/o/oauth2/token 2012-10-19 13: 27: 36 954 (GMT-4) [8] BŁĄD DotNetOpenAuth.Http - WebException fromhttps://accounts.google.com/o/oauth2/token: {"error": "invalid_scope"}

Próbowałem określić jedną lub obie usługi ServiceAccountId i ServiceAccountUser bez powodzenia.

Po drugie, nawet jeśli otrzymam IAuthorizationState, nie jestem pewien, jak uzyskać IAuthenticator, który można przekazać do konstruktora AnalyticsService.

Poniżej znajduje się web.config, którego używam do włączania rejestrowania DotNetOpenAuth.

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net, Version=1.2.10.0, Culture=neutral, publicKeyToken=1b44e1d426115821" />
    <!--<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler" requirePermission="false"/>-->
    <sectionGroup name="dotNetOpenAuth" type="DotNetOpenAuth.Configuration.DotNetOpenAuthSection, DotNetOpenAuth">
      <section name="openid" type="DotNetOpenAuth.Configuration.OpenIdElement, DotNetOpenAuth" requirePermission="false" allowLocation="true"/>
      <section name="oauth" type="DotNetOpenAuth.Configuration.OAuthElement, DotNetOpenAuth" requirePermission="false" allowLocation="true"/>
      <section name="messaging" type="DotNetOpenAuth.Configuration.MessagingElement, DotNetOpenAuth" requirePermission="false" allowLocation="true"/>
      <section name="reporting" type="DotNetOpenAuth.Configuration.ReportingElement, DotNetOpenAuth" requirePermission="false" allowLocation="true"/>
    </sectionGroup>
  </configSections>
  <log4net>
    <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
      <file value="DotNetOpenAuth.log"/>
      <appendToFile value="true"/>
      <rollingStyle value="Size"/>
      <maxSizeRollBackups value="10"/>
      <maximumFileSize value="100KB"/>
      <staticLogFileName value="true"/>
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date (GMT%date{%z}) [%thread] %-5level %logger - %message%newline"/>
      </layout>
    </appender>
    <appender name="TracePageAppender" type="OpenIdProviderWebForms.Code.TracePageAppender, OpenIdProviderWebForms">
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date (GMT%date{%z}) [%thread] %-5level %logger - %message%newline"/>
      </layout>
    </appender>
    <!-- Setup the root category, add the appenders and set the default level -->
    <root>
      <level value="ALL"/>
      <appender-ref ref="RollingFileAppender"/>
      <appender-ref ref="TracePageAppender"/>
    </root>
    <!-- Specify the level for some specific categories -->
    <logger name="DotNetOpenAuth">
      <level value="ALL"/>
    </logger>
  </log4net>
  <dotNetOpenAuth>
    <!-- This is an optional configuration section where aspects of dotnetopenauth can be customized. -->
    <!-- For a complete set of configuration options see http://www.dotnetopenauth.net/developers/code-snippets/configuration-options/ -->
    <!--<messaging clockSkew="00:10:00" lifetime="00:03:00" strict="true">-->
    <!--<messaging>
      <untrustedWebRequest timeout="00:00:30" readWriteTimeout="00:00:01.500" maximumBytesToRead="1048576" maximumRedirections="10">
        <whitelistHosts>
          -->
    <!-- Uncomment to enable communication with localhost (should generally not activate in production!) -->
    <!--
          <add name="localhost"/>            
        </whitelistHosts>
      </untrustedWebRequest>
    </messaging>-->
    <!-- Allow DotNetOpenAuth to publish usage statistics to library authors to improve the library. -->
    <reporting enabled="false"/>
  </dotNetOpenAuth>
  <appSettings>
    <!--<add key="log4net.Internal.Debug" value="true" />-->
  </appSettings>
  <runtime>
  </runtime>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

questionAnswers(5)

yourAnswerToTheQuestion