1

Oauth2資格情報を使用するコンソールアプリケーションをデバッグしており、サービスプロバイダはリダイレクトURIを指定する必要があります。サービスプロバイダのWebポータルでリダイレクトURIを指定します。このサービスはGoogle Analyticsです。Visual StudioでのC#.NET非同期/要求待ちのためのLocalhostポートの指定

Node.jsアプリケーションを使用して正常にサービスをテストしました。サービスの設定では、リダイレクトURIをhttp://localhost:8080と指定しました。 Nodeアプリケーションはデフォルトでポート8080から実際に起動するので、http-serverを実行し、http://localhost:8080を参照してサービスを呼び出し、データの応答を確認します。

ただし、C#コンソールアプリケーションで同じサービスを呼び出そうとすると、ブラウザでHTTP 400エラーが発生します。エラー状態:

The redirect URI in the request, http://localhost:59291/authorize/, does not match the ones authorized for the OAuth client.

私は、アプリケーション、ポートの変更を実行しようとするたびに。ここで(Analytics Reporting API V4 Client Library for .NETから参照)のコードは次のとおりです。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.IO; 
using Google.Apis.AnalyticsReporting.v4; 
using Google.Apis.AnalyticsReporting.v4.Data; 
using Google.Apis.Auth.OAuth2; 
using Google.Apis.Services; 
using Google.Apis.Util.Store; 
using System.Threading; 

namespace Google_Analytics_API_Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      try 
      { 
       var credential = GetCredential().Result; 
       using (var svc = new AnalyticsReportingService(
        new BaseClientService.Initializer 
        { 
         HttpClientInitializer = credential, 
         ApplicationName = "Google Analytics API Console" 
        })) 
       { 
        var dateRange = new DateRange 
        { 
         StartDate = "2017-04-24", 
         EndDate = "today" 
        }; 
        var sessions = new Metric 
        { 
         Expression = "ga:sessions", 
         Alias = "Sessions" 
        }; 
        var date = new Dimension { Name = "ga:date" }; 

        var reportRequest = new ReportRequest 
        { 
         DateRanges = new List<DateRange> { dateRange }, 
         Dimensions = new List<Dimension> { date }, 
         Metrics = new List<Metric> { sessions }, 
         ViewId = "<<viewID>>" 
        }; 

        var getReportsRequest = new GetReportsRequest 
        { 
         ReportRequests = new List<ReportRequest> { reportRequest } 
        }; 
        var batchRequest = svc.Reports.BatchGet(getReportsRequest); 
        var response = batchRequest.Execute(); 
        foreach (var x in response.Reports.First().Data.Rows) 
        { 
         Console.WriteLine(string.Join(",", x.Dimensions) + 
          " " + string.Join(", ", x.Metrics.First().Values)); 
        } 
       } 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine(ex.ToString()); 
      } 
     } 

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

私はデバッグのための静的ポートをIIS Expressを設定する方法を検索しましたが、私はIISがここにも関与していることはよく分からない - だけではなく、 Google Analyticsライブラリによって実装されているTcpClient/TcpListenerオブジェクトのようなものですか?

C#.NETコンソールアプリケーションでasync/await要求のポートを指定する方法はありますか?

+0

jsonファイルの生成と設定を含め、*設定*の手順はすべて完了しましたか? OAuthコールバックはWebサイトアプリケーション向けであり、コールバック用ではありません。これは、OAuthプロバイダがあなたの「ウェブサイト」に「私はこのトークンを持つユーザを認証して、彼を通過させる」と言っている方法です。明らかに、これはデスクトップクライアントアプリケーションにとって無意味です。 –

+0

明示的にリンクされた答えと*はコールバックをもたらさない*。新しいプロジェクトを作成し、その回答に記載されている手順に従って、すべての設定手順を完了し、すべての定数を正しい値に設定し、jsonファイルなどに正しい設定を書き込んでください。 –

答えて

0

ここでの問題は明らかに、リクエストがHttpClient経由で送信されていることです。 Google.Apis.Http.HttpClientfactoryはこれをConfigurableHttpClient経由で返します。 HttpClientは、ローカルのバインドされたIPアドレスを設定するためのメソッドを公開していません。(詳細は下部にあります)

これを解決する最適な方法は、正しい方法で資格情報を使用することです。コンソールアプリケーションから接続しているので、これらの資格情報をOtherに簡単に設定することができます。実際はこれが好ましい方法です。 [資格情報の作成]ボタンをクリックして、[ヘルプを選択]を選択します。このヘルプは、シナリオをガイドすることができます。それ以外の場合は、次のように作成します。

@のパナギオティス・kanavosの提案に

GoogleAPI Credentials, Choose Other

、私は説明を追加します。

のHttpClientのServicePointへのアクセスを公開しません。反射 を使用して、基になるServicePointオブジェクトにアクセスすることができます。あなたは 使用コンソールAPIの資格情報にこれを行うには解析を

ため withingのGoogle APIを使用しない場合にはspecificalローカルアドレスにバインドするためにあなたの試みに解像度 を提供することができるが、この質問を検討してください:Use httpclient to send a request from a specific IP address

私が知っている限り、BaseClientServiceは、カスタムHttpFactoryまたはカスタムHttpClientInitializer(ポスト作成の変更)を設定できるようにするため、上記のように変更されたConfigurableHttpClientを返すカスタムHttpFactoryインスタンスを作成する必要があります。あなたはを通して、あなたのカスタムHttpClientFactoryを渡すことをやったらGoogleApi HttpClientFactory

  • GoogleApi ConfigurableHttpClient
    1. using (var svc = new AnalyticsReportingService(
          new BaseClientService.Initializer 
      { 
          HttpClientInitializer = credential, 
          ApplicationName = "Google Analytics API Console", 
          HttpClientFactory = new CustomHttpClientFactory() 
      })) 
      
    +0

    これは意味をなさない。 HttpClientはHttpWebRequestを使用します。 IPEndpointはちょうど*アドレス*ですが、リスナーではありません。 HttpListenerを作成したとしても、中間ルータのいずれか(すべてではないにしても)がポートへのアクセスをブロックするため、コールを受信できなくなります。もしあなたがHttp * Listener *を作成したいのであれば、あなたはアウトバウンドリクエストをどうにかして作成しても構いません。 –

    +0

    WebRequestはServicePointマネージャを使用しているので、実際にはIPEndpointにバインドすることができます。なぜ追加の説明が必要なのか不明ですが、追加しました。 – LimpingNinja

    +0

    、WebRequestを使用するHttpClientも同様です。 [IPEndpoint](https://msdn.microsoft.com/en-us/library/system.net.ipendpoint(v = vs.110).aspx)は**アドレスです*何もバインドしません、何も聞いていない。 * listenens *は[HttpListener](https://msdn.microsoft.com/en-us/library/system.net.httplistener(v = vs.110).aspx) –

    関連する問題