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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

OAuth

OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

CORS

CORSとはCross-Origin Resource Sharingの頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

Q&A

解決済

2回答

1886閲覧

自分のみ権限で、Google Apps ScriptでのdoPost()を利用した場合に、Requestを受け取る方法

Meganezaru

総合スコア715

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

OAuth

OAuth(Open Authorization)は、APIを通して保護されたリソース(サードパーティのアプリケーション)へアクセスする為のオープンプロトコルです。

CORS

CORSとはCross-Origin Resource Sharingの頭文字をとったもので、ブラウザがオリジン以外のサーバからデータを取得するシステムのことです。

0グッド

1クリップ

投稿2018/11/12 09:00

編集2018/12/04 08:04

Google Spreadsheetsにアクセスするための簡易APIサーバーのようなものを簡単に作れるということで、Google Apps Scriptのウェブアプリを試してみましたが、どうも意図するように動かないというか、もやもやした部分が出てきました。

公式のリファレンスも含め、いろいろ情報を探してみましたが、スキルが低いせいか、希望する情報にたどり着けなかったので、よろしければご教授ください。

CORSには未対応?

外部サーバーに配置したフロントエンドから、postしようとしたところ、CORSヘッダー関連のエラーになりました。

とりあえず、fetchのモードを"no-cors"にすることで、postに関する動作(特定セル情報の更新)はできましたが、そのせいでresponseが得られないので、終了判定ができない状態です。

そもそも、CORSも理解できていないかも・・・ですが・・・、GASに特定の外部オリジンを信用させるための設定をすることはできるのでしょうか?

doGet()でフロントエンドを配信することが前提?

だとすると、プロジェクトに特定の拡張子しか収められないことに、まぁまぁ違和感があります・・・笑
HTMLのみ配信し、他のリソースは外部サーバーから取得するのか、拡張子を変更したりして、むりやりプロジェクトに含めるという方法しかないのでしょうか?

どちらにしても、フロントエンドのフレームワークを利用したりする場合は、面倒な作業が付きまとう気がします・・・

認証のメカニズムは?

ウェブアプリケーションとして導入、する際に、アプリケーションにアクセスできるユーザーを「自分だけ」にした場合、期待する動作として、該当するSpreadsheet(もしくはScript自体?)の所有者のみ実行できることだと解釈しています。

ただ、その場合、所有者であることを、フロントエンド側から、どうやって示せば良いのかはっきりとわかりません。
なんとなく、Chromeであれば、ログインユーザーであったり、他のブラウザであれば、Googleへのログインであったり、するようなのですが・・・
ログインしても、動く時と動かない時があり、その原因がはっきりしませんでした。

そもそも、どんな仕組みで認証することになるのでしょうか?(OAuthあたり、じゃないかな・・・ぐらいの、知識・・・です・・・泣)

私自身の知識が、たくさん足りないことが原因ではありますが、とくに認証周りなどは、知識を得るための入り口もわかっていない状態だったりします(^_^;)
ここを勉強すれば良いとか、この情報を読んでみて、とかでも助かりますので、どうかアドバイスをいただければありがたいです。

よろしくお願いします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

いろいろ調べてみましたが、最終的にはdoPost()は希望通りに使えない・・・だろう・・・という結論に至りました。

CORSの回避(Post時のPreflightで送られるoptionの抑止)は、RequestHeaderのContent-Typeをtext/plainにすることでできました。

認証情報は、Cookieに保存されていて、fetchのoption、credentials: "include"を指定することで、Postに載せることができました。(これは、実施済みでしたが、仕組みを知らずに使ってましたw)

ただし・・・上記二つを実施してPostをしても、Spreadsheetへの書き込みはできますが、Responseがブラウザでブロックされます。結果的にはno-corsと同じですね・・・

ResponseHeaderのAccess-Control-Allow-Originが*で戻ってくるのですが、
credentialsをincludeにした場合は、*を許可しないそうです・・・

GoogleCloudPlatformのプロジェクトに設定されている認証情報に、Originを設定できるっぽい箇所(承認済みの JavaScript 生成元)があるのですが、Google Apps Scriptが自動で追加したものでは、変更の権限がないようでOriginを追加することができませんでした。

この時点で、Googleがサービスとして明らかに抑止していると感じたので、これ以上調査するのをやめました。

投稿2018/12/04 07:55

Meganezaru

総合スコア715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

なにを参考にどういうものを作ったのか全くわからないのですが、説明はしていただけないのでしょうか。
多分doGetdoPostでできないとおっしゃっておられるとエスパーしました。

こういうのを参考になさると多少はやりたいことに近づけるのではないでしょうか?

投稿2018/11/16 12:56

papinianus

総合スコア12705

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Meganezaru

2018/11/16 15:09

エスパーありがとうございます(^_^) やりたいことは、中途半端な感じですが、出来ています。 ・doGet()で、セル情報の取得(全員アクセス可) ・doPost()で、セルへの書き込み(自分のみ) 中途半端になっている部分が、質問させてもらった部分で、 ・doPost()の時、no-corsモードじゃないと、書き込めない ・自分からのアクセスであることを明示する仕組みが理解できない ということです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問