首页 > 解决方案 > GCP Sheets/Docs API 不在 iframe 中显示文件

问题描述

我有一个项目,每次保存新对象时,它还会创建空白的 Google Doc 和 Google Sheet 作为用户可以使用的其他资源。

为此,我在 Google Cloud Platform 中创建了一个服务帐户,生成了 .json,授予了文档中所述的权限(浏览器、服务帐户管理员、IAM 工作负载身份池管理员、工作负载身份用户)。

还创建了一个 API 密钥。

有了它,我可以成功地创建、删除、列出所有文件并重命名特定文件(下面的脚本),但我无法使用文档和电子表格本身加载 iframe。我尝试在 iframe 的 src 中加载的地址:

https://docs.google.com/document/d/DOC_ID?key=APIKEY

https://docs.google.com/spreadsheets/d/SHEET_ID/?key=APIKEY

https://docs.googleapis.com/v1/documents/DOC_ID?key=APIKEY

https://sheets.googleapis.com/v4/spreadsheets/SHEET_ID?key=APIKEY

前两个地址加载“您需要访问权限 - 请求访问权限,或切换到具有访问权限的帐户”。Google 消息(此处为“您需要访问”问题的屏幕截图)。

其他两个抛出 401 -“请求缺少所需的身份验证凭据。预期的 OAuth 2 访问令牌、登录 cookie 或其他有效的身份验证凭据。”。

问题:

  1. 如何在 Google 的标准 iframe 上显示这些文件(使用用户界面、工具栏等)?

  2. 有没有办法像个人 Google Drive 允许的那样查看由 Google Cloud Platform 网站中的服务帐户创建的所有文件?我尝试了 drive.google.com 并且它是空的,但我可以使用 Python 将它们全部列出。

  3. 我试图让它与 AWS 中的 Workload Identity Federation 一起工作,所以我创建了池,使用我的 AWS ID 将 AWS 设置为提供者,并从“连接的服务帐户”中选择了服务帐户。是否有关于 AWS 配置方面的指南?我暂时把它放在一边,因为我不知道下一步。

# GOOGLE DOC CREATION
def document_create(request, obj):

    SERVICE_ACCOUNT_FILE = '.json'
    SCOPES = ['https://www.googleapis.com/auth/documents']
    body = {
        'title': obj.title,
    }
    creds = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    service = build('docs', 'v1', credentials=creds)
    document = service.documents().create(body=body).execute()
# GOOGLE SHEET CREATION
def spreadsheet_create(request, obj):

    SERVICE_ACCOUNT_FILE = '.json'
    SCOPES = ['https://www.googleapis.com/auth/spreadsheets']
    spreadsheet = {
        'properties': {
            'title': obj.title,
        }
    }
    creds = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    service = build('sheets', 'v4', credentials=creds)
    spreadsheet = service.spreadsheets().create(body=spreadsheet, fields='spreadsheetId').execute()
# LIST ALL FILES
def index(request, template='gcp/index.html'):
    
    SERVICE_ACCOUNT_FILE = '.json'
    SCOPES = [] # WORKS WITHOUT ANY SCOPE SOMEHOW
    creds = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    service = build('drive', 'v3', credentials=creds)
    
    results = service.files().list().execute()
    drive_list = results.get('files', [])
# RENAME A FILE
def rename(request):

    SERVICE_ACCOUNT_FILE = '.json'
    SCOPES = [] # ALSO WORKS WITHOUT ANY SCOPE SOMEHOW
    creds = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
    service = build('drive', 'v3', credentials=creds)
    
    try:
        service.files().update(fileId=file_id, body={'name': new_file_name}).execute()
    except Exception as e:
        pass

(这是我在这里的第一篇文章,如果有什么不应该的,请道歉。)

提前致谢!

标签: pythongoogle-cloud-platformgoogle-sheets-apigoogle-docs-apiservice-accounts

解决方案


原来使用 Sheets and Docs API 创建的每个新文件默认都是私有的。

要使其可用,您只需添加新的权限,指定类型(用户/域)、角色和与所选类型对应的值。

这必须使用 Drive API 完成。


推荐阅读