【Unity】UnityエディタでGoogle APIのOAuth2認証をする(ライブラリを使う版)

Unityエディタからライブラリを使ってGoogle APIのOAuth2認証をする方法をまとめました。

Unity2019.3.3

はじめに

この記事ではUnityエディタからGoogle APIのOAuth2認証をする方法をまとめます。
Google公式ライブラリを使わなくても認証することは可能ですが、
本記事ではGoogle公式のクライアントライブラリを使う方法を紹介します。

また本記事における例として、Spreadsheetからデータを読み込むことを目的とします。
他の用途に使う際にはSpreadsheetの部分を適宜読み替えてください。

なおライブラリを使わない実装は以下の記事を参照してください。

light11.hatenadiary.com

Google APIの初期設定を行う

OAuth認証を使うには、まず認証情報を取り扱うアプリケーションの情報を登録する必要があります。
登録を行うためにGoogleのDeveloper Consoleにアクセスします。

console.developers.google.com

すると以下のようなページが表示されます。
スクリーンショットは英語表記になっていますが適宜読み替えてください)

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を選択します。

クライアントIDを生成

Application typeはOtherを選択し、適当な名前を入力してCreateボタンを押下します。
※最近の仕様ではOtherの代わりに「Desktop」があるようなので、Desktopがある場合にはこちらを選択してください

クライアントIDを生成

Client IDとClient Secretが表示されたら作成完了です。

使用するAPIを有効にする

最後に使用するAPIを有効にしておきます。
左側のメニューからLibraryを選択します。

Libraryを選択

使いたいAPIを検索してENABLEボタンを押下します。
今回はGoogle Sheets APIを有効にしました。

APIを有効化

クライアントライブラリをインストールする

さて次にクライアントライブラリをインストールします。
.Net用のライブラリは以下のリポジトリで作成されています。

github.com

ただこのリポジトリの説明にもある通り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です。

取り出したDLLはUnityプロジェクト配下の適当なフォルダに格納します。
今回はエディタからの使用を想定しているのでEditorフォルダ内に入れました。

DLLを格納

あとは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に含まれるすべてのシートの名前を出力してみました。

関連

light11.hatenadiary.com

参考

console.developers.google.com

github.com