Google Drive APIを使用する

Goで試してみる。

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

2024年8月13日火曜日