GAE/GoからSpreadsheetを弄る事になった
仕事でGAE/GoからSpreadsheetを操作することになったので色々調べた
一旦はサンプル通り作り、JWTを使ってクライアントを作成し、サービスアカウントから操作ができた
しかし、テスト段階ではサービスアカウントのアドレスを共有して操作していたのが、
お客様の環境ではそれはアカンとのことだった
じゃあどうすんのってことで、GSuite側のセキュリティ設定を弄ることで、
サービスアカウントがあたかもGSuiteに所属するユーザとして操作をする方法があった
そこら辺の設定まわりに苦戦したので一通り備忘録としてまとめておく
やったことは以下2点
- サービスアカウントの許可設定(ここがGsuiteの設定)
- クライアント作成時にSubjectを設定
サービスアカウントの許可設定(GSuite)
GSuite側で設定する必要がある
GSuiteに管理者権限アカウントを使用してログイン
セキュリティから詳細設定を開き、「APIクライアントアクセスを管理する」を押す
「クライアント名」には使用するサービスアカウントの詳細画面にある「一意のID」(21桁の数字)を、
「1つ以上のAPIスコープ」には後述するクライアントで使用するAPIスコープを入力する
クライアント作成時にSubjectを設定
クライアント作成部分でスコープとSubject
を設定する
スコープは前述したGSuiteの設定と同様にする
Subjectは成り済ますユーザのメールアドレスを文字列で入れる。
サービスアカウントが設定したアドレスのユーザに成り済ます形でSpreadsheetを操作する
(当たり前だが、成り済ますユーザが権限を持っていないSpreadsheetは操作できない)
package app
import (
"context"
"io/ioutil"
"net/http"
"golang.org/x/oauth2/google"
"google.golang.org/api/drive/v3"
"google.golang.org/api/sheets/v4"
)
func NewClient(ctx context.Context) (*http.Client, error) {
jsonData, err := ioutil.ReadFile("サービスアカウント作成後にダウンロードしたJSONキーファイル名.json")
if err != nil {
return nil, err
}
// スコープの設定。何が必要になるかはAPIのリファレンスに書いてある。
conf, err := google.JWTConfigFromJSON(jsonData, sheets.SpreadsheetsScope, drive.DriveScope)
if err != nil {
return nil, err
}
// test@gmail.com の部分には成り済ますユーザのアドレスを入れる
conf.Subject = "test@gmail.com"
// クライアントを返す
return conf.Client(ctx), nil
}
まとめ
以上の設定でGAE/GoからSpreadsheetをサービスアカウントを共有設定せず、SheetsAPIで操作できる
実際にやってからしばらく経ってるので何か書き忘れとかあるかもしれない
Spreadsheetの操作については以下の記事を参考にしました
Google Sheets APIでセルの値を書き込む方法
Go言語からGoogle Sheets API v4でスプレッドシートを新規作成する方法