Bảng điều khiển mở bình thường trong trình duyệt trên laptop, nhưng cùng script bảng tính đó lại thất bại với lỗi địa chỉ không khả dụng. Bật hay tắt VPN không thay đổi gì, vì yêu cầu không hề rời khỏi laptop. Apps Script chạy trên hạ tầng của Google và mở kết nối riêng từ đó. Một sự thật duy nhất ấy quyết định toàn bộ thiết kế.

Tách hai câu hỏi trước khi thay đổi bất cứ điều gì: máy nào gửi yêu cầu, và bên nhận chấp nhận thông tin xác thực nào.

Yêu cầu không bao giờ bắt đầu trên laptop của bạn

Một tab trình duyệt gửi từ laptop, qua bộ điều hợp VPN, hậu tố DNS nội bộ và vào mạng con riêng. UrlFetchApp gửi từ một máy chủ do Google quản lý, nên nó chỉ thấy các bộ phân giải của Google, các địa chỉ thoát của Google và không thấy tuyến split-tunnel nào của bạn. Hai đường đi chia sẻ một tài liệu bảng tính, không phải một vị trí mạng. Trong nhật ký truy cập của ứng dụng, nỗ lực của script hiện ra như một địa chỉ Google chứ không phải địa chỉ từ nhóm VPN, và đó là xác nhận nhanh nhất bạn có được.

Đó là lý do các sửa chữa cục bộ không làm gì. Trỏ laptop sang bộ phân giải khác, khởi động lại ứng dụng VPN hay thêm một mục trong hosts đều thay đổi đường đi của trình duyệt và để nguyên đường đi của script như cũ.

Điều đó loại trừ gì

Một điểm cuối chỉ dành cho nội bộ thì không thể chạm tới từ Apps Script, và danh sách IP được phép là vật thay thế yếu cho kiểm soát truy cập ở vị trí này. Các dải thoát của Google rộng, dùng chung với khách hàng khác và không thể gắn với một script duy nhất. Tài liệu tham chiếu UrlFetchApp nêu rằng các yêu cầu xuất phát từ nhóm IP của Google, và đó là phiên bản có thẩm quyền của tuyên bố ấy. Mở ứng dụng nội bộ cho những dải đó là đưa vào lưu lượng mà bạn không thể quy cho ai.

Phiên trình duyệt cũng hành xử như vậy. Một cookie hay một phiên SSO trong trình duyệt của laptop không đi kèm yêu cầu, vốn là một ứng dụng khách HTTPS mới không có trạng thái phiên. Mọi thứ phụ thuộc vào chuyển hướng SSO của trình duyệt đều kết thúc tại chuyển hướng đó chứ không phải tại dữ liệu của bạn.

Hai hình thức khả thi

Hình thức thứ nhất cho script một API đã được phê duyệt. Công bố dịch vụ nội bộ sau một cổng kiểm tra danh tính bên gọi, rồi để script trình ra thông tin xác thực mà cổng chấp nhận, chẳng hạn token của tài khoản dịch vụ. Trong Apps Script điều đó nghĩa là một thư viện OAuth2 hoặc ScriptApp.getOAuthToken(), cùng với danh sách danh tính bên gọi được phép ở phía API thay cho danh sách IP.

Hình thức thứ hai đảo chiều. Một công việc nội bộ truy vấn hệ thống riêng và công bố kết quả được kiểm soát vào một Sheet, một đối tượng Cloud Storage hay một bảng BigQuery mà script đọc. Một công việc Cloud Run, một bộ lập lịch tại chỗ hay một bước ETL sẵn có đều có thể là công việc đó, và không cái nào phải chấp nhận một kết nối đi vào. Bảng tính sau đó tiêu thụ một tập dữ liệu thay vì một giao diện.

Hình thức nào thắng phụ thuộc vào độ tươi mới, kiểm soát ở mức trường và ai phải có khả năng kiểm toán người đọc.

Kết quả đã công bố phải chứa gì

Một luồng theo chiều ngược cần một hợp đồng rõ ràng: các trường nó mang, khoảng làm mới, nhóm người đọc và điều gì xảy ra khi công việc nội bộ thất bại. Không có bốn điều đó, bảng tính lặng lẽ hiển thị số của hôm qua. Thêm một cột dấu thời gian được tạo và số dòng để một lần công bố cũ hoặc thiếu sót hiện ra ngay trong trang tính, mà không ai phải mở nhật ký.

Chiều API cũng cần một hợp đồng: cổng chấp nhận thông tin xác thực nào, token mang scopes nào và những danh tính bên gọi nào được phép. Một phản hồi 200 có trang đăng nhập không phải là lời gọi thành công, nên hãy kiểm tra phần thân chứ không chỉ mã trạng thái.

Đọc lỗi từ phía đúng

Apps Script báo một máy chủ không thể chạm tới như ngoại lệ địa chỉ không khả dụng, đó không phải thông báo từ chối kết nối của trình duyệt. Một 403 từ cổng nghĩa là yêu cầu đã tới và thông tin xác thực hoặc chính sách đã bị từ chối. Một trang đăng nhập HTML nghĩa là yêu cầu đã chạm tới một lớp tương tác mà script không thể hoàn tất. Ba kiểu lỗi khác nhau với ba người chịu trách nhiệm khác nhau.

Giữ nhật ký của script bên cạnh kết quả của trình duyệt thay vì thay cái này bằng cái kia. Câu hỏi còn lại khi đó là một quyết định tích hợp thông thường: cấp cho môi trường đó quyền truy cập cần thiết, hoặc chuyển cho nó một kết quả được kiểm soát.

Bài viết liên quan