Unityエディタからライブラリを使ってGoogle APIのOAuth2認証をする方法をまとめました。
Unity2019.3.3
はじめに
この記事ではUnityエディタからGoogle APIのOAuth2認証をする方法をまとめます。
Google公式ライブラリを使わなくても認証することは可能ですが、
本記事ではGoogle公式のクライアントライブラリを使う方法を紹介します。
また本記事における例として、Spreadsheetからデータを読み込むことを目的とします。
他の用途に使う際にはSpreadsheetの部分を適宜読み替えてください。
なおライブラリを使わない実装は以下の記事を参照してください。
Google APIの初期設定を行う
OAuth認証を使うには、まず認証情報を取り扱うアプリケーションの情報を登録する必要があります。
登録を行うためにGoogleのDeveloper Consoleにアクセスします。
すると以下のようなページが表示されます。
(スクリーンショットは英語表記になっていますが適宜読み替えてください)
プロジェクトを作成
まず左上のSelect a project > NEW PROJECT
を選択して新しくプロジェクトを作成します。
以下のようなプロジェクト作成ページが表示されるので適当なプロジェクト名を入力してCREATEボタンを押下します。
これでプロジェクトが作成されました。
同意画面を作成
次に画面上部から今作ったプロジェクトを選択し、左側のメニューからOAuth consent screenを選択します。
用途に応じてInternalあるいはExternalを選択してCREATEボタンを押下します。
次の画面ではApplication Nameに適当な名前を入力して画面最下部のSAVEボタンを押下します。
これで同意画面が作成されました。
クライアントIDを作成
次にクライアントIDを作成します。
左側のメニューからCredentialsを選択します。
続いて画面上部からCREATE CREDENTIALS > OAuth client ID
を選択します。
Application typeはOtherを選択し、適当な名前を入力してCreateボタンを押下します。
※最近の仕様ではOtherの代わりに「Desktop」があるようなので、Desktopがある場合にはこちらを選択してください
Client IDとClient Secretが表示されたら作成完了です。
使用するAPIを有効にする
最後に使用するAPIを有効にしておきます。
左側のメニューからLibraryを選択します。
使いたいAPIを検索してENABLEボタンを押下します。
今回はGoogle Sheets APIを有効にしました。
クライアントライブラリをインストールする
さて次にクライアントライブラリをインストールします。
.Net用のライブラリは以下のリポジトリで作成されています。
ただこのリポジトリの説明にもある通りUnityはUnsupported Frameworksなので、導入するのに少し手順が必要です。
以下でその手順を説明します。
NuGetでインストールする
まず適当なプロジェクトをVisual Studioで開きます。
開いたら ツール > NuGetパッケージマネージャー > パッケージマネージャーコンソール
を選択します。
コンソールが起動したら使いたいサービスのPackageに応じて以下のように入力します。
この例ではSpreadsheetのライブラリをインストールしていますが、認証用のものも依存関係に含まれています。
PM> Install-Package Google.Apis.Sheets.v4
これでインストールが完了しました。
DLLを取り出してUnityに入れる
インストールが完了したら次にdllだけを取り出します。
dllはWindowsであればC:\Users\UserName\.nuget\packages
あたりに入っているはずです。
追記: Macは/Users/UserName/.local/share/google-filedatastoreあたり
この各フォルダの中から.Net 4.5用のDLLを抜き出します。
Spreadsheetの場合はnet45というフォルダ配下の以下のDLLが取り出せればOKです。
- Google.Apis.dll
- Google.Apis.PlatformServices.dll
- Google.Apis.Auth.dll
- Google.Apis.Auth.PlatformServices.dll
- Google.Apis.Core.dll
- Google.Apis.Sheets.v4.dll
- Newtonsoft.Json.dll
取り出したDLLはUnityプロジェクト配下の適当なフォルダに格納します。
今回はエディタからの使用を想定しているのでEditorフォルダ内に入れました。
あとはDLLのインポート設定をInspectorから行えば設定完了です。
今回はプラットフォームをEditorだけにし、アセンブリから明示的な参照を行うためAuto Referenceのチェックを外しました。
OAuth2認証をするプログラムを書く
ここまでくれば後は下記のように書くだけでOAuth2認証をすることができます。
using System.Threading; using System.Threading.Tasks; using Google.Apis.Auth.OAuth2; using Google.Apis.Sheets.v4; using UnityEngine; public class Example : MonoBehaviour { public async Task AuthorizeAsync() { var clientId = ""; var clientSecret = ""; var user = "example-user"; // クライアントIDとクライアントシークレットを設定 var secrets = new ClientSecrets { ClientId = clientId, ClientSecret = clientSecret }; var scopes = new[] { // 使いたいServiceのスコープを配列で指定 SheetsService.Scope.SpreadsheetsReadonly }; var credential = await GoogleWebAuthorizationBroker.AuthorizeAsync(secrets, scopes, user, CancellationToken.None); } }
前述の方法で取得したClient IDとClient Secretをそれぞれの変数に入れておきます。
またscopeには付与したい権限を指定します。今回はSpreadsheetのRead権限だけ指定しています。
このメソッドを呼ぶと、ブラウザに遷移して認証画面が表示されます。
また認証により取得できるアクセストークンには有効期限があり、
期限が切れた場合にはリフレッシュトークンを用いてアクセストークンを再取得する処理が必要になりますが、
上のように書くだけでこれらの処理も内部的に行ってくれます。
認証情報の保存とuserについて
さてこのようにして得られた認証情報(アクセストークンとかリフレッシュトークンなど)は決まった場所に格納されます。
例えばWindowsだとC:\Users\User Name\AppData\Roaming\Google.Apis.Auth
あたりになるかと思います。
ここに認証情報が保存されるわけですが、この際のファイル名に上述のソースコードのuser
が使用されます。
つまり、他の用途で認証を行う際に重複しないようにこの文字列を指定しておく必要があります。
このuserとはいわゆるユーザIDのことなので、SDKを使用しているアプリでユーザごとにランダムなIDを発行・保存しておく実装が良さそうです。
SpreadSheetを読み込む
今回はついでにスプレッドシートの情報を読み込んでみます。
スプレッドシートを読み込むには、先ほどの認証情報を使ってServiceを初期化します。
// Serviceを初期化 var sheetService = new SheetsService(new BaseClientService.Initializer{ HttpClientInitializer = credential }); // 当該Spreadsheetのシート名一覧を出力 var spreadSheetId = ""; var result = await sheetService.Spreadsheets.Get(spreadSheetId).ExecuteAsync(); foreach (var sheet in result.Sheets) { Debug.Log(sheet.Properties.Title); }
今回はSpreadsheetに含まれるすべてのシートの名前を出力してみました。