質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.63%

認証ありのdoPostの実現

受付中

回答 0

投稿

  • 評価
  • クリップ 2
  • VIEW 389

yoshio1

score 1

実現したいこと

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から自分がこのアカウントの所有者であることを証明する方法などは存在するでしょうか。
もしくは、これと同等の機能を、何かしらの代替手段で実現する方法はあるでしょうか。

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;
}
{
    "title": "〇〇のアンケート",
    "description": "これはアンケートです。",
    "items": [
        {
            "question": "会員ID"
        },
        {
            "question": "名前"
        },
        {
            "question": "電話番号"
        }
    ]
}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる