如何登录appengine中的任意用户以使用Drive SDK?

Ann*_*nna 5 python google-app-engine python-2.7 google-drive-api google-api-python-client

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

因此,我开始考虑存储arbitray oauth令牌 - 尤其是刷新令牌 - 在初始设置后自动登录此帐户.但是,所有API和文档都假定多个用户手动登录,并且我无法在oauth API中找到允许或记录除当前登录用户之外的任何内容的功能.

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

bos*_*ter 5

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

builtins:
- remote_api: on
Run Code Online (Sandbox Code Playgroud)

通过执行

remote_api_shell.py -s your_app_id.appspot.com
Run Code Online (Sandbox Code Playgroud)

从命令行,您可以访问可以在应用程序环境中执行的shell.在执行此操作之前,请确保已部署应用程序(更多内容在下面的本地开发中),并确保google-api-python-client通过pip安装和运行源enable-app-engine-project /path/to/project来将其添加到App Engine项目中.

进入远程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)
Run Code Online (Sandbox Code Playgroud)

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

run被调用时,Web浏览器将打开,并提示您接受客户端的OAuth访问你与指定CLIENT_IDCLIENT_SECRET后成功完成,这将节省的实例CredentialsModel中部署的应用程序的数据存储your_app_id.appspot.com,它会使用它存储在KEY_NAME您提供的.

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

storage = StorageByKeyName(CredentialsModel, KEY_NAME, CREDENTIALS_PROPERTY_NAME)
credentials = storage.get()
Run Code Online (Sandbox Code Playgroud)

地方发展:

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

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

remote_api_shell.py -s localhost:PORT
Run Code Online (Sandbox Code Playgroud)

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

如上所述,如果您没有包含正确的google-api-python-client模块,则会失败.

编辑:以前建议使用交互式控制台:

http://localhost:PORT/_ah/admin/interactive
Run Code Online (Sandbox Code Playgroud)

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