LoginSignup
2
2

More than 3 years have passed since last update.

GAE/GoからSpreadsheetをサービスアカウントに共有せず操作する話

Last updated at Posted at 2020-02-03

GAE/GoからSpreadsheetを弄る事になった

仕事でGAE/GoからSpreadsheetを操作することになったので色々調べた
一旦はサンプル通り作り、JWTを使ってクライアントを作成し、サービスアカウントから操作ができた
しかし、テスト段階ではサービスアカウントのアドレスを共有して操作していたのが、
お客様の環境ではそれはアカンとのことだった
じゃあどうすんのってことで、GSuite側のセキュリティ設定を弄ることで、
サービスアカウントがあたかもGSuiteに所属するユーザとして操作をする方法があった
そこら辺の設定まわりに苦戦したので一通り備忘録としてまとめておく
やったことは以下2点

  • サービスアカウントの許可設定(ここがGsuiteの設定)
  • クライアント作成時にSubjectを設定

サービスアカウントの許可設定(GSuite)

GSuite側で設定する必要がある
GSuiteに管理者権限アカウントを使用してログイン
セキュリティから詳細設定を開き、「APIクライアントアクセスを管理する」を押す

image.png

「クライアント名」には使用するサービスアカウントの詳細画面にある「一意のID」(21桁の数字)を、
「1つ以上のAPIスコープ」には後述するクライアントで使用するAPIスコープを入力する
image.png

クライアント作成時にSubjectを設定

クライアント作成部分でスコープとSubjectを設定する
スコープは前述したGSuiteの設定と同様にする
Subjectは成り済ますユーザのメールアドレスを文字列で入れる。
サービスアカウントが設定したアドレスのユーザに成り済ます形でSpreadsheetを操作する
(当たり前だが、成り済ますユーザが権限を持っていないSpreadsheetは操作できない)

client.go
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でスプレッドシートを新規作成する方法

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2