Google Apps Scriptで、認証ありのdoPostを実現したい
実現したいこと
curlから認証ありのdoPostのAPIを叩く
現在、GoogleAppsScriptのdoPostを利用して、POSTデータからgoogleフォームを自動作成してフォームの公開用URL等を返すAPIを利用しています。
公開方法は、
公開 → webアプリケーションとして公開 → アプリケーションにアクセスできるユーザ:全員(匿名ユーザを含む)
として、googleアカウントにログインしていないユーザでも、urlを知っていればAPIを叩ける状況になっています。
(というよりも、curlを利用してAPIを叩いているので、匿名で叩けるようにしています)
今は個人用のgoogleアカウントで運用しているので何も問題はありませんが、
、このAPIを、会社で利用しているのGoogleアカウントで実行する必要が出てきました。
この場合、アプリケーションにアクセスできるユーザの選択肢として、自分か、会社に所属するアカウントのみ となってしまい、
curl等の匿名からAPIを叩けない状況になっています。
アプリケーションにアクセスできるユーザは自分だけでいいのですが、curl等で、どのようにして自分がこのアカウントの所有者であることを証明すれば良いのでしょうか。
doPostではなく、doGetでも同様で、
このアカウントでログインしているブラウザであれば、
「現在のウェブアプリケーションのURL」を叩けるのですが、
curl等だと、当たり前ですがgoogleアカウントのログイン画面に飛ばされてしまいます。
なにかしらのトークン等を発行してHTTPヘッダーに持たせることで、
curlから自分がこのアカウントの所有者であることを証明する方法などは存在するでしょうか。
もしくは、これと同等の機能を、何かしらの代替手段で実現する方法はあるでしょうか。
curlでなくても、pythonやjsなどで書かれたスクリプトからでも大丈夫です。
GASに詳しい方や、経験のある方、すこしでも参考になりそうな情報を持っている方がいらっしゃいましたら、
教えていただけると幸いです。
よろしくお願いします。
試したこと
ExecutionAPI(Apps Script API?)であれば認証ありのAPIを作成できるようなのですが、
トークン等を発行してcurlから叩けるまでには至っていません。
このスクリプトで必要な OAuth スコープ
https://www.googleapis.com/auth/forms
該当のソースコード
function doPost(e) {
var postData = JSON.parse(e.postData.getDataAsString());
if (postData.title) {
const title = postData.title;
const description = postData.description;
} else {
// タイトルがない場合はエラーを返す
var returnData = ContentService.createTextOutput();
returnData.setMimeType(ContentService.MimeType.JSON);
returnData.setContent(
JSON.stringify({
message: 'please input title!',
error: true,
})
);
return returnData;
}
// フォーム作成
var form = FormApp.create(title);
form.setDescription(description);
var items = postData.items;
var itemIdList = []
while (items.length) {
var item = items.shift();
var textItem = form.addTextItem();
textItem
.setTitle(item.question);
itemIdList.push({
question: item.question,
item_id: textItem.getId(),
});
}
var returnData = ContentService.createTextOutput();
returnData.setMimeType(ContentService.MimeType.JSON);
returnData.setContent(
JSON.stringify({
published_url: form.getPublishedUrl(),
edit_url: form.getEditUrl(),
error: false,
form_id: form.getId(),
item_id_list: itemIdList,
})
);
return returnData;
}
POSTデータ
{
"title": "〇〇のアンケート",
"description": "これはアンケートです。",
"items": [
{
"question": "会員ID"
},
{
"question": "名前"
},
{
"question": "電話番号"
}
]
}