我想从返回 json 的应用程序脚本 Web 应用程序触发 doGet(e) 事件。 我们的网络应用程序无法在我们的组织域之外访问,因此需要服务帐户。 我执行了下面的代码,但“发生错误:401 客户端错误”
from google.oauth2 import service_account
from google.auth.transport.requests import AuthorizedSession
import requests
SERVICE_ACCOUNT_FILE = r'C:\Users\USER\Documents\fga-openrpa-sa.json'
SCOPES = ['https://www.googleapis.com/auth/script.external_request']
credentials = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
authed_session = AuthorizedSession(credentials)
url = 'https://script.google.com/a/macros/s/path/exec?page=something'
try:
response = authed_session.get(url)
response.raise_for_status()
print("Response status code:", response.status_code)
print("Response content:", response.text)
except requests.exceptions.RequestException as e:
print("An error occurred:", e)
我也尝试了 oauth,但服务帐户更容易设置。我也没有可用的代码
在尝试使用服务帐户访问 Google Apps Script Web 应用程序时遇到“401 客户端错误”的原因是,即使使用服务帐户,Web 应用程序也需要身份验证。服务帐户仅用于服务器端授权,而需要模拟用户身份验证才能触发
doGet(e)
。
以下是可以考虑的替代解决方案:
1. 使用用户身份验证(OAuth 2.0):
- 这是最常见且推荐的访问 Google Apps Script Web 应用程序的方法,因为它可以正确处理用户授权。
- 需要设置 OAuth 2.0 流以获取用户访问令牌,然后将其用于向 Web 应用程序发出请求。
-
以下是使用 Python 进行设置的步骤:
```python from googleapiclient.discovery import build from google_auth_oauthlib.flow import InstalledAppFlow from google.auth.transport.requests import AuthorizedSession
# 替换为的信息 SCOPES = ['https://www.googleapis.com/auth/script.projects'] SCRIPT_ID = 'your_script_id'
flow = InstalledAppFlow.from_client_secret_file('client_secret.json', SCOPES) credentials = flow.run_local_server()
authed_session = AuthorizedSession(credentials)
url = f'https://script.google.com/macros/s/{SCRIPT_ID}/exec?page=something'
try: response = authed_session.get(url) response.raise_for_status() print("Response status code:", response.status_code) print("Response content:", response.text) except requests.exceptions.RequestException as e: print("An error occurred:", e) ```
-
请记住,此方法需要用户交互以授予应用程序访问其数据的权限。
2. 将 Web 应用程序发布为可由所有人(甚至未登录的用户)访问:
- 这是不太安全的选择,因为它允许任何人调用的 Web 应用程序。
- 如果的 Web 应用程序不处理敏感数据并且确定要将其公开,则此选项可能适用。
- 要更改部署设置,请在 Apps Script 编辑器中转到“部署”>“新建部署”>“任何人,即使未登录 Google 也可以访问”。
3. 使用 Google Cloud Functions 或类似服务作为中介:
- 在此方法中,可以创建一个 Cloud Function,该函数可以使用服务帐户进行身份验证,然后调用的 Apps Script Web 应用程序。
- 这允许将用户身份验证与服务帐户授权分离,但需要设置和管理额外的基础结构。
请记住,使用服务帐户模拟用户身份验证会带来安全风险,并且违反了 Google 的服务条款。 建议使用 OAuth 2.0 或其他安全方法来对用户进行身份验证并访问的 Web 应用程序。
标签:python,google-apps-script From: 78828061