以下のステップで解説していきます。
コードの記述
- 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 },
