Прыборная панэль добра адкрываецца ў браўзеры на ноўтбуку, а той жа скрыпт табліцы вяртае памылку недаступнасці адраса. Уключэнне і выключэнне VPN нічога не мяняе, бо запыт наогул не пакідае ноўтбук. Apps Script выконваецца ў інфраструктуры Google і адкрывае сваё ўласнае злучэнне адтуль. Гэты адзіны факт вызначае ўвесь дызайн.

Аддзяліце два пытанні, перш чым нешта мяняць: якая машына адпраўляе запыт і якое пасведчанне прымае атрымальнік.

Запыт ніколі не пачынаецца на вашым ноўтбуку

Укладка браўзера адпраўляе з ноўтбука, праз адаптар VPN, унутраны суфікс DNS і ў прыватную падсетку. UrlFetchApp адпраўляе з хоста, якім кіруе Google, таму ён бачыць рэзалверы Google, адрасы выхаду Google і ніводзін з вашых маршрутаў split-tunnel. Два шляхі маюць агульны толькі дакумент табліцы, а не сеткавае месца. У журнале доступу праграмы спроба скрыпта выглядае як адрас Google, а не як адрас з пула VPN, і гэта найхутчэйшае пацвярджэнне, якое вы атрымаеце.

Таму лакальныя выпраўленні нічога не даюць. Пераключэнне ноўтбука на іншы рэзалвер, перазапуск кліента VPN або даданне запісу ў hosts змяняе шлях браўзера і пакідае шлях скрыпта такім, якім ён быў.

Што гэта выключае

Да пункта, даступнага толькі знутры, з Apps Script не дабрацца, а спіс дазволеных IP у гэтым месцы — слабая замена кантролю доступу. Дыяпазоны выхаду Google шырокія, агульныя з іншымі кліентамі і іх немагчыма прывязаць да аднаго скрыпта. Даведка UrlFetchApp сцвярджае, што запыты паходзяць з пула IP Google, і гэта аўтарытэтная версія такога сцвярджэння. Адкрыццё ўнутранай праграмы для гэтых дыяпазонаў пускае трафік, які вы не можаце прыпісаць.

Сесіі браўзера паводзяць сябе гэтак жа. Cookie або сесія SSO у браўзеры ноўтбука не падарожнічае разам з запытам, які з'яўляецца свежым кліентам HTTPS без стану сесіі. Усё, што залежыць ад перанакіравання SSO у браўзеры, сканчаецца на гэтым перанакіраванні, а не на вашых даных.

Дзве працоўныя формы

Першая форма дае скрыпту зацверджаны API. Апублікуйце ўнутраную службу за шлюзам, які аўтэнтыфікуе выклікаючага, і няхай скрыпт прадстаўляе пасведчанне, якое шлюз прымае, напрыклад токен сэрвіснага акаўнта. У Apps Script гэта азначае бібліятэку OAuth2 або ScriptApp.getOAuthToken(), а таксама спіс дазволеных ідэнтычнасцей выклікаючага на баку API замест спісу IP.

Другая форма перавяртае кірунак. Унутраная задача запытвае прыватную сістэму і публікуе кантраляваны вынік у Sheet, аб'ект Cloud Storage або табліцу BigQuery, якую чытае скрыпт. Задача Cloud Run, лакальны планавальнік або існуючы крок ETL могуць быць такой задачай, і ніводная з іх не павінна прымаць уваходнае злучэнне. Тады табліца спажывае набор даных замест інтэрфейсу.

Якая форма пераможа, залежыць ад свежасці, кантролю на ўзроўні палёў і ад таго, хто павінен мець магчымасць аўдыту чытача.

Што павінен змяшчаць апублікаваны вынік

Зваротнаму патоку патрэбен яўны кантракт: палі, якія ён нясе, інтэрвал абнаўлення, група чытачоў і што адбываецца, калі ўнутраная задача падае. Без гэтых чатырох табліца ціха паказвае ўчорашнія лікі. Дадайце згенераваны слупок з адзнакай часу і колькасць радкоў, каб састарэлая або частковая публікацыя была бачная ў самой табліцы, без таго каб хтосьці адкрываў журнал.

Кірунак API таксама патрабуе кантракта: якое пасведчанне прымае шлюз, якія scopes нясе токен і якія ідэнтычнасці выклікаючага дазволеныя. Адказ 200, які змяшчае старонку ўваходу, не з'яўляецца паспяховым выклікам, таму правярайце цела, а не толькі код стану.

Чытайце памылку з правільнага боку

Apps Script паведамляе пра недаступны хост як выключэнне недаступнасці адраса, і гэта не паведамленне браўзера пра адмову ў злучэнні. 403 ад шлюза азначае, што запыт дайшоў і пасведчанне або палітыка былі адхіленыя. HTML-старонка ўваходу азначае, што запыт дасягнуў інтэрактыўнага слоя, які скрыпт не можа завяршыць. Тры розныя збоі з трыма рознымі ўладальнікамі.

Трымайце журнал скрыпта побач з вынікам браўзера, а не замяняйце адно другім. Тады пытанне, якое засталося, — звычайнае інтэграцыйнае рашэнне: даць гэтаму асяроддзю патрэбны доступ або даставіць яму кантраляваны вынік.

Падобныя артыкулы