1. Google Cloud Platformでプロジェクトを作成する題
多くのサービスがGoogle Cloudに寄せてあるようだ。
Google Drive APIのみの使用であれば基本的に無料。
https://console.cloud.google.com/
2. Google Drive APIを有効にする
以下のURLから。
https://console.cloud.google.com/apis/library/drive.googleapis.com
3. OAuth 2.0 クライアント IDを作成する
Google DriveをAPI経由でアクセスする方法はユーザにGoogle経由で認証(ログイン)してもらって取得したトークンを利用するといった流れになる。
https://console.cloud.google.com/apis/credentials/consent
設定項目として事前に承認済のドメインが必要。サーチコンソールから設定する。
https://search.google.com/search-console/about
ドメインを自分で取得している場合はTXTやCNAMEの設定でよいがGAEなどを使用している場合はURLプレフィックスを使用する。
OAuth 同意画面 → スコープ → テストユーザー → 概要
の順に設定する。
3.1 OAuth 同意画面定
OAuth 同意画面 → UserType:外部 → 作成
UserType:内部はGoogle Workspace Userのみ
- アプリ名:
- ユーザーサポートメール:
- アプリのロゴ:
- アプリケーションのホームページ:
- アプリケーションプライバシーポリシーのリンク:
- アプリケーションの利用規約のリンク:
- 承認済みドメイン:
プライバシーポリシーと利用規約のリンクは少なくともテスト中は仮で良さそうだ。
3.2 スコープの設定
スコープの追加または削除 → Google Drive APIでフィルタ → 利用するスコープを選択
アプリでファイル置き場がほしいだけなら
「このアプリで使用する Google ドライブ上の特定のファイルのみの参照、編集、作成、削除」
だけで良い。
3.3 テストユーザーの追加
gmailのアドレスを追加する。
概要で全体を確認して問題なければOK。後で編集も可能。
4. Google Drive APIの認証情報を取得
する https://console.cloud.google.com/apis/api/drive.googleapis.com/credentials
認証情報を作成 → OAuth クライアント ID
→ アプリケーションの種類: ウェブクライアント
→ 名前: 任意 → 作成
『承認済みの JavaScript 生成元』『承認済みのリダイレクト URI』へアプリケーションのドメインを指定する
localhostも指定しておくとローカルで動作確認可能。
- クライアントIDを控えておく。
- クライアントシークレットを控えておく。
- JSONをダウンロードして保存する。
GoからGoogle Drive APIへアクセスしてみる
go get -u google.golang.org/api/drive/v3
go get -u golang.org/x/oauth2/google
http.HandleFunc("/oauth2callback", handleAuthCallback) func handleAuthCallback(w http.ResponseWriter, r *http.Request) { fmt.Print("handleAuthCallback\n") // クエリから認証コードを取得 code := r.URL.Query().Get("code") // Google Drive APIの認証 b, err := os.ReadFile("credentials/client_secret.com.json") // jsonのファイルパス // fmt.Printf("b: %s\n", b) if err != nil { fmt.Printf("Unable to read client secret file: %v", err) return } // Configを生成 config, err := google.ConfigFromJSON(b, drive.DriveFileScope) if err != nil { fmt.Printf("Unable to parse client secret file to config: %v", err) return } // トークンを交換 token, err := config.Exchange(context.Background(), code) if err != nil { http.Error(w, "Failed to exchange token: "+err.Error(), http.StatusInternalServerError) return } // トークンを使ってDriveサービスを作成 client := config.Client(context.Background(), token) driveService, err := drive.New(client) if err != nil { http.Error(w, "Failed to create Drive client: "+err.Error(), http.StatusInternalServerError) return } // ファイルのメタデータを設定 f := &drive.File{ Name: "TestFile.txt", MimeType: "text/plain", } // ファイル内容を作成 fileContent := "Hello, World!" reader := io.NopCloser(strings.NewReader(fileContent)) // ファイルのアップロード _, err = driveService.Files.Create(f).Media(reader).Do() if err != nil { log.Fatalf("Unable to create file: %v", err) } // Drive APIを使った処理例(ファイルリストを取得) files, err := driveService.Files.List().PageSize(10).Fields("nextPageToken, files(id, name)").Do() if err != nil { http.Error(w, "Unable to retrieve files: "+err.Error(), http.StatusInternalServerError) return } fmt.Fprintf(w, "Files:\n") for _, f := range files.Files { fmt.Fprintf(w, "%s (%s)\n", f.Name, f.Id) } }ダウンロードしたjsonファイルのredirect_urisを置き換えると認証後のリダイレクト先が変わる。
redirect_urisにport番号を指定すると弾かれるので80以外にしている場合は認証後に手動で置き換えるといった対応が必要になる。
リダイレクトURLに含まれるコードから取得したトークンを利用していく。このトークンを保持したりリフレッシュしたりしてGoogle Drive APIを利用することになる。
ファイルを作成して一覧を取得するといったサンプルコードになっているがスコープを./auth/drive.fileに設定している場合1ファイルしか確認できない。
API経由で作成したファイルのみアクセスすることが可能になる。
Google Driveを確認する。
https://drive.google.com/drive/home
参考
https://qiita.com/doran/items/15b2c59adb410ddeeb8a