##はじめに
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");
const privatekey = require("./privatekey.json");
exports.handler = async (event) => {
const res = await Promise.resolve()
.then(function () {
return new Promise(function (resolve, reject) {
//JWT auth clientの設定
const jwtClient = new google.auth.JWT(
privatekey.client_email,
null,
privatekey.private_key,
["https://www.googleapis.com/auth/drive"]
);
//authenticate request
jwtClient.authorize(function (err, tokens) {
if (err) {
reject(err);
} else {
//認証成功
resolve(jwtClient);
}
});
});
})
.then(function (jwtClient) {
return new Promise(async function (resolve, reject) {
const drive = google.drive({ version: "v3", auth: jwtClient });
drive.files.list(
{
pageSize: 10,
fields: "nextPageToken, files(id, name)",
},
(err, res) => {
if (err) reject(err);
const files = res.data.files;
if (files.length) {
resolve(files);
} else {
resolve("No files found.");
}
}
);
});
});
console.log(res)
};
##ややこしかったこと
認証方法にはいくつかあり、 公式リファレンスのquickstartにもあるようなOAuth 2.0 クライアント IDを用いた方法では、トークンの有効期限が一時間のため、常時使い続けるためにはリフレッシュトークンを用いて一時間に一回アクセストークンを更新しなければならない。こちらの場合はGUIで試すこともできる。
そのため、今回はサービスアカウントを利用した。
サービスアカウントでは、スコープを与えるだけでは、ファイルに書き込んだりすることができない。googleDriveのコンソールからサービスアカウントのメールアドレスに編集権限を与える必要がある。
##お世話になったサイト
https://qiita.com/Fujimon_fn/items/9a0ec4eca75ce0784722
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