【问题标题】:Google Drive API: The user has not granted the app errorGoogle Drive API:用户未授予应用程序错误
【发布时间】:2018-09-02 08:36:38
【问题描述】:

我正在关注https://developers.google.com/drive/api/v3/quickstart/python 上的Quickstart。我已经通过页面启用了驱动器 API,加载了 credentials.json 并且可以成功列出我的谷歌驱动器中的文件。但是,当我想下载文件时,我收到了消息

`The user has not granted the app ####### read access to the file`

除了将该范围放入我的代码之外,我还需要做更多的事情还是需要激活其他东西?

SCOPES = 'https://www.googleapis.com/auth/drive.file'
client.flow_from_clientsecrets('credentials.json', SCOPES)

【问题讨论】:

  • 如果您尚未请求令牌(即完成 OAuth 流程),则您尚未获得许可。 IE。在快速入门中,通常有与if credentials.invalid: ... 相关的代码,其中flow.run_local_server() 之类的内容用于向用户显示提示,然后根据您的应用程序类型请求访问(也可能是刷新)令牌。
  • 还要注意drive.file 范围意味着有关于文件访问的特殊规则。也就是说,用户必须“选择”您的应用来打开文件(或使用应用创建文件),以便您的应用获得使用该文件的权限。
  • 所以,凭据不是无效的,否则我将无法列出内容。所以对于范围,drive.file 应该允许下载。
  • 您的声明“drive.file 应该允许下载”通常是错误的。正如我上面提到的,对于drive.file 范围内的文件访问有一些特殊规则。您提到遵循快速入门,它使用drive.metadata.readonly 允许listing 所有文件。您仍然需要获得明确的用户权限才能获取内容,因为您使用的是drive.file 范围和一个不是用您的应用程序创建的文件。因此,您必须要求用户使用您的应用程序打开文件。查看云端硬盘文件选择器代码。
  • 从哪里获得“获取内容的显式用户权限”

标签: python google-drive-api google-oauth google-api-python-client


【解决方案1】:

我遇到了同样的错误。我授权了整个范围,然后检索了文件,并使用 io.Base 类将数据流式传输到文件中。请注意,您需要先创建文件。

from __future__ import print_function
from googleapiclient.discovery import build
import io
from apiclient import http
from google.oauth2 import service_account

SCOPES = ['https://www.googleapis.com/auth/drive']

SERVICE_ACCOUNT_FILE = 'credentials.json'
FILE_ID = <file-id>

credentials = service_account.Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)

service = build('drive', 'v3', credentials=credentials)

def download_file(service, file_id, local_fd):

  request = service.files().get_media(fileId=file_id)
  media_request = http.MediaIoBaseDownload(local_fd, request)

  while True:    
    _, done = media_request.next_chunk()

    if done:
      print ('Download Complete')
      return

file_io_base = open('file.csv','wb')

download_file(service=service,file_id=FILE_ID,local_fd=file_io_base)

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    一旦你通过Quick-Start Tutorial,最初的范围是:

    SCOPES = 'https://www.googleapis.com/auth/drive.metadata.readonly'
    

    因此,在列出文件并决定下载后,它将无法正常工作,因为您需要再次生成令牌,因此更改范围不会重新创建或提示您进行首次运行时发生的“谷歌授权”。

    要强制生成令牌,只需删除您当前的令牌或使用新文件从存储中存储您的密钥:

    store = file.Storage('tokenWrite.json')
    

    【讨论】:

      【解决方案3】:

      删除 token.pickle 并重新运行程序。

      详细说明:- 运行快速入门示例后,它会存储一个 token.pickle。

      此后,即使您在 google api 控制台中更改范围并在代码中添加以下范围:-

      SCOPES = ['https://www.googleapis.com/auth/drive']
      

      在您删除和更早范围的 token.pickle 之前,它不会起作用。 一旦删除重新运行程序。将出现一个选项卡,授权应用程序并完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-11
        • 2012-11-13
        • 2019-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多