Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

.NETからGoogle Analytics APIを呼び出し、データを取得する

ASP.NET MVCからGoogle Analytics APIを使用する(後編)

  • LINEで送る
  • このエントリーをはてなブックマークに追加

 この記事では、C#とASP.NET MVCからGoogle Analytics APIを呼び出す方法について紹介します。APIを呼び出すことでGoogleのサービスの情報を.NETのプログラムから利用することができます。前編では、Google Cloud Consoleでの設定、Visual Studioでのプロジェクト作成といった準備を行いました。後編に当たる本稿では、コードを記述し、実際に動かしてみるところまでを紹介します。

目次

 以下のステップで解説していきます。

コードの記述

  1. FlowMetadata継承クラスの追加
  2. AuthCallbackController継承クラスの追加
  3. HomeControllerの修正
  4. ビューAbout.cshtmlの変更

動作確認(アプリケーションの実行)

  1. アプリケーションを実行
  2. Google Analyticsデータを表示するページへ移動
  3. Googleのログイン画面へリダイレクト
  4. ログインしたアカウントのGoogle Analyticsデータを使用してよいかを確認
  5. Google Analyticsデータの表示

コーディングの実施

 それでは、コーディングを始めていきましょう。今回のサンプルでは主に3つのクラスと2つのビューを追加/変更します。

FlowMetadata継承クラスの追加

 まず、認証用のメタデータを格納するFlowMetadataクラス(Google.Apis.Auth.OAuth2.Mvc名前空間)を継承するクラス「MyFlowMetadata」を作成します。

FlowMetadataクラスのコード(MyFlowMetadata.cs)
using Google.Apis.Analytics.v3;
using Google.Apis.Auth.OAuth2;
using Google.Apis.Auth.OAuth2.Flows;
using Google.Apis.Auth.OAuth2.Mvc;
using Google.Apis.Util.Store;
using System;
using System.Web.Mvc;

namespace GaMvcSample.Infra
{
    // OAuth認証に関するメタデータを設定するクラス
    public class MyFlowMetadata : FlowMetadata
    {

        // (1)認証情報を保持するフィールド
        private static readonly IAuthorizationCodeFlow myFlow =
            new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
            {
                ClientSecrets = new ClientSecrets
                {
                    // 「クライアントID」を設定
                    ClientId = "649539766830-r9ficnl9gan9i43j0jlf76kvn9enp4f0.apps.googleusercontent.com",

                    // 「クライアントシークレット」を設定
                    ClientSecret = "bQyK0tIvzi9-TuBFCnSoYX1s"
                },

                // 今回の接続で許可を求めるGoogleサービスの機能と権限を指定
                Scopes = new[] { AnalyticsService.Scope.AnalyticsReadonly },

                // トークンレスポンスのファイル格納場所。
                DataStore = new FileDataStore("DotNetOAuthSample")
            });

        // (2)設定した認証情報を渡すプロパティ
        public override IAuthorizationCodeFlow Flow
        {
            get { return myFlow; }
        }


        // (3)ユーザーIDを返すメソッド
        public override string GetUserId(Controller controller)
        {
            var user = controller.Session["UserId"];
            if (user == null)
            {
                // ここでは毎回新しいGUIDを発行しているが、同一ユーザーとみなせるIDでも良い
                user = Guid.NewGuid();
                controller.Session["UserId"] = user;
            }
            return user.ToString();

        }

        // (4)認証後に呼び出すパスを返すプロパティ
        public override string AuthCallback
        {
            get { return @"/MyAuthCallback/IndexAsync"; }
        }
    }
}

 このクラスでは、認証に関する情報や挙動を設定します。(1)(2)の部分では、Google Cloud Consoleに表示されるクライアントIDとクライアントシークレットを設定しています。

 そして、認可対象にしたい処理をScopesプロパティに設定します。ここでは、「Google Analyticsの読み取り権限」として、AnalyticsService.Scope.AnalyticsReadonlyを設定しています。

 DataStoreプロパティには、OAuthのトークンレスポンスを格納するフォルダ名を指定します。「Google.Apis.Auth.OAuth2.Responses.TokenResponse-<GetUserIdメソッドの戻り値>」というファイルが、「C:\Users\<ユーザー名>\AppData\Roaming\<DataStoreに指定した値>」に作成されます。作成されるファイルの中身は「{"access_token":"ya29.1.AADtN_WtGFU4bXkXe3dZrFRDNAfDKShzN-CpFu8giXJStU_tmCKIQvQrXt75zg1i92PexQ","token_type":"Bearer","expires_in":3599,"Issued":"2013-12-08T18:25:27.4802329+09:00"}」のような内容となり、アクセストークンなどが格納されます。

 (3)では、認証ユーザーを識別するユーザーIDの文字列を返します。同一の単位で扱いたいユーザー別にIDを用意します。このユーザーIDは、フレームワーク側「AuthCallbackController」などから呼び出されます。

 (4)は、認証後のコールバックで呼び出すパスを返すプロパティです。コントローラ名とメソッド名の組み合わせです。現時点ではメソッド名は変更できません。デフォルト値の"AuthCallback/IndexAsync"のままで問題なければ、オーバーライドする必要はありません。

クライアント情報をJSONファイルから読み込む

 今回のサンプルでは、クライアントIDとクライアントシークレットを直接コードに記述しました。しかし、環境情報をハードコーディングしたくない場合は、資格情報が記載されたJsonファイルを読み込ませることも可能です。手順としては、Cloud ConsoleからダウンロードできるJSONファイルをサーバーの任意の場所に配置します(ここではC:\CodeZine\client_secret.jsonに配置)。そして、myFlowフィールドの部分を以下のように書き換えることで実現できます。

認証情報をJSONファイルから読み込み(MyFlowMetadata.cs改変して抜粋)
private static readonly IAuthorizationCodeFlow myFlow =
    new GoogleAuthorizationCodeFlow(new GoogleAuthorizationCodeFlow.Initializer
    {
        ClientSecrets = GoogleClientSecrets.Load(new FileStream(
                    @"C:\CodeZine\client_secret.json", FileMode.Open, FileAccess.Read)).Secrets
     ,
     Scopes = new[] { AnalyticsService.Scope.AnalyticsReadonly },

  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • WINGSプロジェクト 青木 淳夫 (株式会社ネクストスケープ)(アオキ アツオ)

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂...

  • 山田 祥寛(ヤマダ ヨシヒロ)

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:ASP.NET MVCからGoogle Analytics APIを使用する
All contents copyright © 2005-2018 Shoeisha Co., Ltd. All rights reserved. ver.1.5