7

I have an app in GAE (Python 2.7), and now need access to Google Drive to display a (shared) list of folders and documents.

Searching usually results in pointers to DrEdit, including App Engine and Google Drive API, which asks the same question but accepts an answer I don't agree with, as DrEdit is an example app for Google Drive, not GAE.

The files list from the Drive API is what I'd like to be able to use from GAE: https://developers.google.com/drive/v2/reference/files/list

4

2 回答 2

4

虽然 Google App Engine 和 Google Drive 都是 Google 产品,但遗憾的是它们没有直接关联。google-api-python-client您必须安装的库可以访问 Google Drive API 。

流程见Python Google Drive API Quickstart Guide,总结形式如下:

  1. 在 Google 方面:允许 GAE 程序访问 Drive API

    • 激活 Drive API。单击转到凭据按钮继续...
    • 创建您的同意屏幕:设置您的OAuth 同意屏幕,因为如果尚未设置,Google 会抛出奇怪的错误:
      • 单击OAuth 同意屏幕选项卡
      • 选择一个电子邮件地址并输入一个产品名称
    • 获取凭据:
      • 单击凭据选项卡
      • 选择添加凭据,然后选择OAuth 2.0 客户端 ID。选择您的应用程序类型,并输入相关详细信息。您可以稍后更改它们!
      • 返回“凭据”选项卡,下载 JSON 凭据(一直到表格的右侧,下载按钮仅在您将鼠标悬停在它附近时才会出现)。重命名它client_secret.json并将其放在您的根代码目录中。您将需要它来向用户请求凭据。
  2. 在您这边:下载google-api-python-client,将其解压缩到您的代码目录并运行python setup.py install. 这将安装包含许多 Google 产品 API 的库。

  3. 现在您已准备好使用 Drive API。您可以使用示例代码测试您的访问。阅读它,因为它是编写您自己的代码的好指南!如果您正在访问用户数据,您将需要在他们登录时请求用户凭据,并且很可能存储它们。然后,要使用 API,最简单的方法是获取service对象:

    import httplib2
    from apiclient import discovery
    
    credentials = get_credentials() #Your function to request / access stored credentials
    #Authorise access to Drive using the user's credentials
    http = credentials.authorise(httplib2.Http())
    #The service object is the gateway to your API functions
    service = discovery.build('drive', 'v2', http=http)
    
    #Run your requests using the service object. e.g. list first 10 files:
    results = service.files().list(maxResults=10).execute()
    # ... etc ... Do something with results
    

上面的代码片段是从示例代码修改而来的。

可以在此处找到Google Drive 的参考 API 。

将 GAE 链接到其他 Google 产品的 API 以及例如日历也需要相同的一般过程。写你的程序一切顺利!

于 2015-11-26T11:18:05.350 回答
1

为了将来参考(这个问题已经很老了,但它似乎仍然是一个问题),现在 GCP IAM API 有一个端点来获取具有任意范围的访问令牌。我将此问题理解为 2 条腿 OAuth 流程(应用程序可以访问自己的 Drive 文件),而不是 3 条腿 OAuth 流程(应用程序代表客户请求访问 Drive API) .

该端点用于服务帐户委托,这是一个更复杂的流程。

您可以使用以下命令获得服务帐户的正确权限,以便为自己生成令牌:

gcloud iam service-accounts add-iam-policy-binding $(gcloud config get-value project)@appspot.gserviceaccount.com --member serviceAccount:$(gcloud config get-value project)@appspot.gserviceaccount.com --role roles/iam.serviceAccountTokenCreator

例子

一旦服务帐户具有正确的权限,您可以通过首先在 CLI 上进行身份验证来获取具有正确范围的令牌(GAE 不需要此步骤,因为默认服务帐户已经过身份验证):

gcloud iam service-accounts keys create key --iam-account $(gcloud config get-value project)@appspot.gserviceaccount.com
gcloud auth activate-service-account $(gcloud config get-value project)@appspot.gserviceaccount.com --key-file key
gcloud config set account $(gcloud config get-value project)@appspot.gserviceaccount.com

然后,您可以对 IAM API 进行经过身份验证的调用,以获取具有不同范围的令牌:

curl -H"Authorization: Bearer $(gcloud auth print-access-token)" -H'content-type:application/json' https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/$(gcloud config get-value project)@appspot.gserviceaccount.com:generateAccessToken -d"{'scope':['https://www.googleapis.com/auth/drive']}"

使用此令牌,您可以直接为默认 GAE 服务帐户 () 有权访问的文件调用 Drive API:

token=$(curl -H"Authorization: Bearer $(gcloud auth print-access-token)" -H'content-type:application/json' https://iamcredentials.googleapis.com/v1/projects/-/serviceAccounts/$(gcloud config get-value project)@appspot.gserviceaccount.com:generateAccessToken -d"{'scope':['https://www.googleapis.com/auth/drive']}"|jq -r .accessToken)

curl -H"Authorization: Bearer $token" https://www.googleapis.com/drive/v3/files/<FILE_ID>

最后,记得清理(删除此示例的键):

gcloud iam service-accounts keys delete $(cat key|jq -r .private_key_id) --iam-account $(cat key|jq -r .client_email) -q
gcloud auth revoke $(gcloud config get-value project)@appspot.gserviceaccount.com
rm key

要进行调用以从 GAE 生成访问令牌,您可以使用Google Cloud Client Libraries。对于 Python,您将使用google.cloud.iam_credentials_v1.IAMCredentialsClient.generate_access_token


总结一下:

  1. 授予iam.serviceAccountTokenCreatorGAE 默认服务帐户
  2. 授予该帐户对特定驱动器文件的访问权限
  3. projects.serviceAccounts/generateAccessToken从 IAM 凭证 API ( )生成具有正确范围的令牌
  4. 使用该令牌对 Drive API 进行经过身份验证的调用

为获得最佳结果,请在初始化期间生成令牌,对其进行缓存,然后每小时重新创建一次(1 小时是生成的访问令牌的最大 TTL)。

于 2019-12-10T14:38:05.230 回答