以下のステップで解説していきます。
コードの記述
- FlowMetadata継承クラスの追加
- AuthCallbackController継承クラスの追加
- HomeControllerの修正
- ビューAbout.cshtmlの変更
動作確認(アプリケーションの実行)
- アプリケーションを実行
- Google Analyticsデータを表示するページへ移動
- Googleのログイン画面へリダイレクト
- ログインしたアカウントのGoogle Analyticsデータを使用してよいかを確認
- Google Analyticsデータの表示
コーディングの実施
それでは、コーディングを始めていきましょう。今回のサンプルでは主に3つのクラスと2つのビューを追加/変更します。
FlowMetadata継承クラスの追加
まず、認証用のメタデータを格納するFlowMetadataクラス(Google.Apis.Auth.OAuth2.Mvc名前空間)を継承するクラス「MyFlowMetadata」を作成します。
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"のままで問題なければ、オーバーライドする必要はありません。
今回のサンプルでは、クライアントIDとクライアントシークレットを直接コードに記述しました。しかし、環境情報をハードコーディングしたくない場合は、資格情報が記載されたJsonファイルを読み込ませることも可能です。手順としては、Cloud ConsoleからダウンロードできるJSONファイルをサーバーの任意の場所に配置します(ここではC:\CodeZine\client_secret.jsonに配置)。そして、myFlowフィールドの部分を以下のように書き換えることで実現できます。
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 },