GASで作成したAPIからの情報を,SafariとFirefoxでは取得できない

実現したいこと

Google Apps Scriptで,スプレッドシートの内容返すAPIを作成し,クライアントのJavaScriptからajaxで取得し,htmlに表示したいです.

発生している問題・分からないこと

Chromeや,Edgeではデータの取得に成功し正常に表示されていますが,Safari(iOS, macOS両方)やFirefoxでは以下のようなエラーが発生し,データを取得できません.
Firefoxのエラーメッセージから,おそらくGoogleのなんらかのログイン処理が影響しているのではないかと考えていますが,回避方法がわかりません.
SafariやFirefoxからでも直接アクセスの場合は,JSONPでデータを取得できます.

エラーメッセージ

error

1Safari: 2[Error] Refused to execute https://script.google.com/a/macros/*****.**.jp/s/*****************************************/exec?callback=callback as script because "X-Content-Type-Options: nosniff" was given and its Content-Type is not a script MIME type. 3 4Firefox: 5[Error] MIME タイプ (“text/html”) の不一致により “https://www.google.com/a/*****.**.jp/ServiceLogin?passive=*******&continue=https%3A%2F%2Fscript.google.com%2Fa%2Fmacros%2F*****.**.jp***************************exec%3Fcallback%3Dcallback&followup=https%3A%2F%2Fscript.google.com%2Fa%2Fmacros%2F*****.**.jp%2Fs%2F*********************exec%3Fcallback%3Dcallback” からのリソースがブロックされました (X-Content-Type-Options: nosniff)。 6[Warning] <script> のソース “https://script.google.com/a/macros/*****.**.jp/s/*****************************************/exec?callback=callback” の読み込みに失敗しました。

該当のソースコード

GoogleAppsScript

1function doGet(e) { 2 var id = PropertiesService.getScriptProperties().getProperty('DocID'); 3 var sheet = SpreadsheetApp.openById(id).getSheetByName("シート1"); 4 5 (中略 スプレッドシートの内容を取得して,reJsonTextに格納する処理) 6 7 var out = ContentService.createTextOutput(); 8 var callback = e.parameter.callback; 9 if (callback) { 10 responseText = callback + "(" + JSON.stringify(reJsonText) + ")"; 11 out.setMimeType(ContentService.MimeType.JAVASCRIPT); 12 } else { 13 responseText = JSON.stringify(reJsonText); 14 out.setMimeType(ContentService.MimeType.JSON); 15 } 16 out.setContent(responseText); 17 18 return out; 19}

JavaScript

1function RefreshData() {2 const endpoint = "https://script.google.com/a/macros/*****.**.jp/s/*****************************************/exec";3 $.ajax({4 type: 'GET',5 url: endpoint,6 dataType: 'jsonp',7 data: {8 //省略9 },10 jsonpCallback: 'callback'})11 .done(function(out) {12 var statusTxt = String(out.status);13 document.getElementById("load").innerHTML = out.loadtime;14 //省略 取得したデータを表示15 })16 .fail(function(jqXHR, textStatus, errorThrown) {17 //省略 エラー画面表示18 console.log("XMLHttpRequest : " + jqXHR.status + "\n" + "textStatus : " + textStatus + "\n" + "errorThrown : " + errorThrown.message);19 });20}

調べたこと

ajaxからアクセスした時のServiceLoginのヘッダ↓

概要 URL: https://script.google.com/a/macros/*****.**.jp/s/*****************************************/exec?callback=callback URL: https://www.google.com/a/*****.**.jp/ServiceLogin?passive=*******&continue=https%3A%2F%2Fscript.google.com%2Fa%2Fmacros%2F*****.**.jp***************************exec%3Fcallback%3Dcallback&followup=https%3A%2F%2Fscript.google.com%2Fa%2Fmacros%2F*****.**.jp%2Fs%2F*********************exec%3Fcallback%3Dcallback ステータス: 200 ソース: ネットワーク イニシエータ: jquery-3.3.1.min.js:2:81006 リクエスト GET /a/macros/*****.**.jp/s/*****************************************/exec Accept: */* Referer: http://***********/ Sec-Fetch-Dest: script Sec-Fetch-Mode: no-cors Sec-Fetch-Site: cross-site User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15 応答をリダイレクト 302 Cache-Control: private, max-age=0 Date: Mon, 20 May 2024 07:47:11 GMT Expires: Mon, 20 May 2024 07:47:11 GMT Location: https://www.google.com/a/*****.**.jp/ServiceLogin?passive=*******&continue=https%3A%2F%2Fscript.google.com%2Fa%2Fmacros%2F*****.**.jp***************************exec%3Fcallback%3Dcallback&followup=https%3A%2F%2Fscript.google.com%2Fa%2Fmacros%2F*****.**.jp%2Fs%2F*********************exec%3Fcallback%3Dcallback リクエスト :method: GET :scheme: https :authority: www.google.com :path: /a/*****.**.jp/ServiceLogin?passive=*******&continue=https%3A%2F%2Fscript.google.com%2Fa%2Fmacros%2F*****.**.jp***************************exec%3Fcallback%3Dcallback&followup=https%3A%2F%2Fscript.google.com%2Fa%2Fmacros%2F*****.**.jp%2Fs%2F*********************exec%3Fcallback%3Dcallback Accept: */* Accept-Encoding: gzip, deflate, br Accept-Language: ja Connection: keep-alive Host: www.google.com Referer: http://***********/ Sec-Fetch-Dest: script Sec-Fetch-Mode: no-cors Sec-Fetch-Site: cross-site User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15 レスポンス :status: 200 Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 Cache-Control: no-cache, no-store Content-Encoding: gzip Content-Length: 814 Content-Security-Policy: script-src 'nonce-2BygkBpzMcgSExWgpoZUkA' 'unsafe-inline';object-src 'self';base-uri 'self';report-uri /cspreport Content-Type: text/html; charset=UTF-8 Date: Mon, 20 May 2024 07:47:11 GMT Expires: Mon, 01-Jan-1990 00:00:00 GMT Pragma: no-cache Server: GSE X-Content-Type-Options: nosniff X-Frame-Options: DENY X-XSS-Protection: 1; mode=block クエリー文字列パラメータ passive: 1209600 continue: https://script.google.com/a/macros/*****.**.jp/s/*****************************************/exec?callback=callback followup: https://script.google.com/a/macros/*****.**.jp/s/*****************************************/exec?callback=callback

直接アクセス時のechoのヘッダ↓

概要 URL: https://script.googleusercontent.com/a/macros/*****.**.jp/echo?user_content_key=**********************************************&lib=*************** ステータス: 200 ソース: ネットワーク アドレス: ***.***.***.**:*** リクエスト :method: GET :scheme: https :authority: script.googleusercontent.com :path: /a/macros/*****.**.jp/echo?user_content_key=**********************************************&lib=*************** Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Encoding: gzip, deflate, br Accept-Language: ja Connection: keep-alive Host: script.googleusercontent.com Sec-Fetch-Dest: document Sec-Fetch-Mode: navigate Sec-Fetch-Site: none User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.4 Safari/605.1.15 レスポンス :status: 200 Access-Control-Allow-Origin: * Alt-Svc: h3=":443"; ma=2592000,h3-29=":443"; ma=2592000 Cache-Control: no-cache, no-store, max-age=0, must-revalidate Content-Encoding: gzip Content-Security-Policy: frame-ancestors 'self' Content-Type: text/javascript; charset=utf-8 Date: Mon, 20 May 2024 08:00:02 GMT Expires: Mon, 01 Jan 1990 00:00:00 GMT Pragma: no-cache Server: GSE Vary: Sec-Fetch-Dest, Sec-Fetch-Mode, Sec-Fetch-Site X-Content-Type-Options: nosniff X-Frame-Options: SAMEORIGIN X-XSS-Protection: 1; mode=block クエリー文字列パラメータ user_content_key: ********************************************** lib: ***************

補足

  • Google Chromeではそのままで表示され,Edgeでは「設定」→「プライバシー、検索、サービス」→「トラッキングの防止」の例外設定でドメインを追加するとJavaScriptから取得できました.
  • Google Workspaceを使用しているため,GASの処理を実行するには組織内のGoogleアカウントが必要になっています.

コメントを投稿

0 コメント