我在GAE(Python 2.7)中有一个应用程序,现在需要访问Google Drive才能显示(共享)文件夹和文档列表。
搜索通常会产生指向DrEdit的指针,包括App Engine and Google Drive API,它会询问相同的问题,但会接受我不同意的答案,因为DrEdit是Google云端硬盘的示例应用,而不是GAE。
我希望能够在GAE中使用Drive API中的文件列表:https://developers.google.com/drive/v2/reference/files/list
答案 0 :(得分:4)
虽然Google App Engine和Google Drive都是Google产品,但遗憾的是它们没有直接关联。您必须安装google-api-python-client
库才能访问Google Drive API。
该过程可在Python Google Drive API Quickstart Guide找到,汇总表格如下:
在Google方面:允许您的GAE计划使用Drive API Access
client_secret.json
并将其放在根代码目录中。您将需要此来向用户请求凭据。在您身边:Download the google-api-python-client
library,将其解压缩到您的代码目录中并运行python setup.py install
。这将安装包含许多Google产品API的库。
现在您已准备好使用Drive API。您可以使用sample code测试访问权限。阅读它,因为它是编写自己的代码的好指南!如果要访问用户数据,则需要在登录时请求用户凭据,并且最有可能存储它们。然后,要使用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
以上代码段已从sample code修改。
Google云端硬盘的参考API可以是found here。
将GAE与其他Google产品的API相关联也需要相同的通用程序,例如日历。所有最好的写你的程序!
答案 1 :(得分:0)
为了将来参考(这个问题已经很老了,但是看起来像it's still an issue),现在GCP IAM API有了一个endpoint来获取具有任意范围的访问令牌。我将这个问题理解为2条腿的OAuth流程(该应用程序可以访问其自己的云端硬盘文件),而不是3条腿的OAuth流程(该应用程序代表客户请求访问Drive API)
该端点用于Service Account delegation,这是一个更复杂的流程。
您可以使用以下命令获得对服务帐户的正确权限,以为其自身生成令牌:
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。
总结:
iam.serviceAccountTokenCreator
授予GAE默认服务帐户projects.serviceAccounts/generateAccessToken
)生成具有正确范围的令牌为获得最佳结果,请在初始化期间生成令牌,将其缓存,然后每小时重新创建一次(1个小时是这些生成的访问令牌的最大TTL)。