Google Apps Scriptで複数のOAuth認証を管理する【GAS】

業務でGoogle Apps Scriptを使う際に、各種ウェブサービスの操作を行うにあたってはもはや当たり前になってるOAuth2.0認証をしてリクエストを投げる手法。ライブラリを使って実現しますが、基本的には1つのサービスに対してしか対応していません。複数のウェブサービスを横断してやり取りするには、工夫が必要です。

今回はそれを実現する手法をまとめました。また、複数サービスのユーザ一覧を1枚にまとめる方法についても追記しています。

今回利用するスプレッドシート

これまでも取り上げてきたOAuth2.0認証を行うものなのですが、同時に複数のサービスに対して認証をして、個別にそれらに関する認証情報をキープして、使う際に柔軟に取り出せるようにする必要があります。

事前準備

GAS側の準備

以下の手順でOAuth2 library for Google Apps Scriptライブラリを追加しましょう。

  1. スクリプトエディタを開きます。
  2. サイドバーよりより「ライブラリ」の+ボタンをクリック
  3. ライブラリを追加欄に「1B7FSrk5Zi6L1rSxxTDgDEUsPzlukDsi4KGuTMorsTQHhGBzBkMun4iDF」を追加します。
  4. 今回はバージョンは43を選択してみます。
  5. 保存ボタンを押して完了

これで、OAuth2.0認証にまつわる様々な関数を手軽に利用できるようになります。

図:ライブラリを追加した様子

複数サービスの認証情報ファイル

スクリプトプロパティに保存しても良いのですが、今回は複数のウェブサービスのClient IDやSecret、リクエストURLなどを一纏めにしたoauth.jsonというファイルを作成し、ドライブに配置してその情報を取得して使うようにしてあります。

oauth.jsonの仕様は以下のような感じ。利用するウェブサービスによっては項目が増えると思うので、そのへんを上手くまとめておきましょう。

今回は2つのウェブサービス。殆ど似ているのですが、webexだけorgIdが必要なので追加しています。また、ウェブサービスによっては当然scopeというものがなかったりするので、サービス毎にきちんと値を入れたり外したりが必要です。このファイルを読み込んで利用します。

ソースコード

認証を行うフロー

認証に用いるoauth.jsonファイルのIDを冒頭に記述しておき、それぞれのサービス認証用にstartoauthを呼び出す関数を用意しておく。startoauth関数は引数でサービス名を受け取って処理をするように作っておく。

実際に認証をする側のコードもこれまでのコードよりも工夫が必要です。

  • startoauth、resetではtempauthのプロパティの値をサービス名で書き換えておく。
  • authpage、authCallbackは特に変更なし
  • checkOAuthでは呼び出すサービス名をtempauthからロードしておく
  • checkOAuthではDriveAppでファイルを読み込ませた後に、共通項目のClient ID, Secret, authurl, tokenurlを取得しておく
  • サービス名で分岐させてサービスの数だけOAuth2.createServiceを用意しておく。
  • setPropertyStoreでPropertiesService.getScriptProperties()を指定していますが、 PropertiesService.getUserProperties(); とすればユーザ毎に認証情報が保存され読み出されるマルチユーザ仕様になります。
  • マルチユーザで使う場合は、複数名同時にアクセスしてくる可能性も考えて、tempauthもgetUserProperties管理にすると良いでしょう。また、スプレッドシートへの書き出しは、排他制御を用いるとデータが壊れずに済みます。

こうすることで、1つの処理系で複数のOAuth2.0認証のやり取りが出来るようになります。サービス毎にリクエストする度にcheckOAuthが呼び出されるわけで、リクエスト前にtempauthの値を各呼び出し元で書き換える手間はありますが、キレイに認証データが格納されます。

サービス毎にOAuth2.createServiceの内容が異なるので、このような工夫が必要となります。

排他制御でGoogle Apps Scriptを安全に実行【GAS】

特定のサービスだけシートから除去する

今回はユーザ一覧を取得して、シートのデータを洗替で書き換えるので、特定のサービス名を持つものを除外するコードを用意してあります。

  • サービス名を指定してそのサービス名が含まれるデータを除外するコードです
  • 一括でデータをsheetに読み込んでおき、配列からfilterを使って除外する
  • シートのデータをクリアした後に除外した新しい配列で上書きする

サービスを取得してシートに書き出す

以下はMicrosoft365のユーザ一覧を取得して書き出すコードです。

  • OAuth認証データを呼び出す前に、tempauthに利用するサービス名を書き込んでおく必要があります。
  • checkOAuthでtempauthの値を元に値を取り出してリクエストする
  • clearServiceRecでデータを特定サービスのデータだけ消去したのちに一括で上書きし直す

関連リンク

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)