はじめに
LambdaからgoogleAPIでGooglDriveをいじりたかったのですが、サービスアカウントを用いた参考文献が少なく、理解するのに時間がかかったのでメモ感覚で書いておきます。
本題
Googleデベロッパーコンソールに行く,プロジェクトを作成
Googleデッッベロッパーコンソールにログイン
APIの有効化>APIライブラリからGoogle Drive API
を有効化させる
認証情報の追加>サービスアカウント
ひとまずロールにオーナーをつけてみよう
アカウントが作成されたら>JSONの鍵を生成&ダウンロード
※鍵のタイプを聞かれたらひとまずJSONを選択
↓こんな感じのやつ
{
"type": "service_account",
"project_id": "exxxxxxxxxxxxxxxxxxxx",
"private_key_id": "axxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"private_key": "-----BEGIN PRIVATE KEY-----\nxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n-----END PRIVATE KEY-----\n",
"client_email": "id-xxx@xxxxxxxxxxxxxxx.iam.gserviceaccount.com",
"client_id": "xxxxxxxxxxxxxxxxxx",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/xxxxxxxxxxxxxxxxxxxxx5.iam.gserviceaccount.co
ソースコードの作成
cd desktop
mkdir sample
cd sample
touch index.js
touch privatekey.json
npm init -y
privatekey.json
に先ほどインストールした認証情報のJSONを入れる
//googleAPIをいじるためのモジュール
npm install googleapis
const{google}=require("googleapis");constprivatekey=require("./privatekey.json");exports.handler=async(event)=>{constres=awaitPromise.resolve().then(function(){returnnewPromise(function(resolve,reject){//JWT auth clientの設定constjwtClient=newgoogle.auth.JWT(privatekey.client_email,null,privatekey.private_key,["https://www.googleapis.com/auth/drive"]);//authenticate requestjwtClient.authorize(function(err,tokens){if(err){reject(err);}else{//認証成功resolve(jwtClient);}});});}).then(function(jwtClient){returnnewPromise(asyncfunction(resolve,reject){constdrive=google.drive({version:"v3",auth:jwtClient});drive.files.list({pageSize:10,fields:"nextPageToken, files(id, name)",},(err,res)=>{if(err)reject(err);constfiles=res.data.files;if(files.length){resolve(files);}else{resolve("No files found.");}});});});console.log(res)};
ややこしかったこと
認証方法にはいくつかあり、 公式リファレンスのquickstartにもあるようなOAuth 2.0 クライアント IDを用いた方法では、トークンの有効期限が一時間のため、常時使い続けるためにはリフレッシュトークンを用いて一時間に一回アクセストークンを更新しなければならない。こちらの場合はGUIで試すこともできる。
そのため、今回はサービスアカウントを利用した。
サービスアカウントでは、スコープを与えるだけでは、ファイルに書き込んだりすることができない。googleDriveのコンソールからサービスアカウントのメールアドレスに編集権限を与える必要がある。
お世話になったサイト
https://developers.google.com/drive/api/v3/quickstart/nodejs
https://developers.google.com/oauthplayground/
https://playwithgoogleapi.hatenablog.com/entry/2019/06/30/133415
https://qiita.com/n0bisuke/items/ff1479cd14e7a0c0be0c
まだ追い切れてなくて気になったやつ
https://github.com/googleapis/google-auth-library-nodejs#samples