4

我有一个应用程序需要登录到单个 Drive 帐户并使用 cron 作业自动对文件执行操作。最初,我尝试使用域管理员登录来执行此操作,但是我无法使用域管理员进行任何测试,因为您似乎无法使用域管理员帐户使用测试服务器,这使得测试我的应用程序有点不可能!

因此,我开始考虑存储 arbitray oauth 令牌(尤其是刷新令牌),以便在初始设置后自动登录此帐户。但是,所有 API 和文档都假设多个个人用户手动登录,并且我在 oauth API 中找不到允许或说明登录到当前登录用户以外的任何内容的功能。

如何以可以在测试域上测试我的代码的方式实现这一点?我可以在不编写自己的 oauth 库并手动执行 oauth 请求的情况下做到这一点吗?或者有没有办法让域管理员授权在本地测试服务器上工作?

4

2 回答 2

5

您可以使用Remote API将单个帐户的凭据加载到您的数据存储中,这可以在您的app.yaml文件中启用:

builtins:
- remote_api: on

通过执行

remote_api_shell.py -s your_app_id.appspot.com

从命令行,您将可以访问可以在应用程序环境中执行的 shell。在执行此操作之前,请确保您已经部署了您的应用程序(下面将详细介绍本地开发),并确保通过安装并运行将其添加到您的 App Engine 项目google-api-python-client中包含源代码。pipenable-app-engine-project /path/to/project

进入远程 shell 后(执行上述远程命令后),执行以下操作:

from oauth2client.appengine import CredentialsModel
from oauth2client.appengine import StorageByKeyName
from oauth2client.client import OAuth2WebServerFlow
from oauth2client.tools import run

KEY_NAME = 'your_choice_here'
CREDENTIALS_PROPERTY_NAME = 'credentials'
SCOPE = 'https://www.googleapis.com/auth/drive'

storage = StorageByKeyName(CredentialsModel, KEY_NAME, CREDENTIALS_PROPERTY_NAME)
flow = OAuth2WebServerFlow(
    client_id=YOUR_CLIENT_ID,
    client_secret=YOUR_CLIENT_SECRET,
    scope=SCOPE)

run(flow, storage)

注意:如果您没有使用google-api-python-client代码部署应用程序,这将失败,因为您的应用程序将不知道如何在本地机器上进行相同的导入,例如from oauth2client.appengine import CredentialsModel.

调用时run,您的 Web 浏览器将打开并提示您接受您指定的客户端的 OAuth 访问权限,CLIENT_ID并且CLIENT_SECRET在成功完成后,它将CredentialsModel在已部署应用程序的数据存储中保存一个实例,your_app_id.appspot.com并将其存储使用KEY_NAME您提供的。

完成此操作后,应用程序中的任何调用者(包括您的 cron 作业)都可以通过执行访问这些凭据

storage = StorageByKeyName(CredentialsModel, KEY_NAME, CREDENTIALS_PROPERTY_NAME)
credentials = storage.get()

当地发展:

如果您想在本地进行测试,您可以通过 dev_appserver.py --port=PORT /path/to/project 在本地运行您的应用程序

您可以使用远程 API shell 执行相同的命令并将其指向您的本地应用程序:

remote_api_shell.py -s localhost:PORT

到达这里后,您可以执行在远程 api shell 中执行的相同代码,并且类似的实例CredentialsModel将存储在本地开发服务器的数据存储区中。

如上所述,如果您没有包含正确的google-api-python-client模块,这将失败。

编辑:这曾经建议在以下位置使用交互式控制台:

http://localhost:PORT/_ah/admin/interactive

但是发现这不起作用,因为socket在App Engine本地开发沙箱中不能正常工作。

于 2012-11-17T02:40:53.217 回答
3

本文介绍了如何通过让域管理员将域范围的权限委派给服务帐户来代表您域的用户与 Google 云端硬盘进行交互

这篇其他文章解释了如何使用服务帐户与您的应用程序拥有的驱动器进行交互。

请注意,这两种方法都使用基于JWT 的服务帐户,并且当前需要修改版本的 google-api-python-client才能在 App Engine 上工作。

与 Google App Engine 服务帐户不同,基于 JWT 的服务帐户应该与开发服务器一起使用。

于 2012-11-17T02:51:20.540 回答