使用cloudstorage时,在dev_appserver上获取AccessTokenRefreshError'valid_grant'

Eze*_*uns 3 python google-app-engine google-cloud-storage google-oauth

在尝试使用Google Cloud Storage示例(或任何使用该cloudstorage模块编写文件的调用时,在其他项目中)我收到以下错误

INFO     2016-12-05 01:16:06,999 client.py:804] Refreshing access_token
INFO     2016-12-05 01:16:07,198 client.py:827] Failed to retrieve access token: {
  "error" : "invalid_grant"
}
ERROR    2016-12-05 01:16:07,200 api_server.py:272] Exception while handling service_name: "app_identity_service"
method: "GetAccessToken"
request: "\n7https://www.googleapis.com/auth/devstorage.full_control"
request_id: "YpfXhQJczA"

... long long stack traces ...

RuntimeError: AccessTokenRefreshError(u'invalid_grant',)
Run Code Online (Sandbox Code Playgroud)

麻烦的是,当我将应用程序部署到Google App Engine时,通话工作正常.

Eze*_*uns 9

我花了几个小时搜索和调试客户端代码,直到我发现它oauth2client正在使用存储在文件系统中某处的一些默认应用程序凭据.似乎这些凭证可能是遗留在以前版本的GAE SDK中的,其中包含一个被Google拒绝的旧刷新令牌.

在Windows上,这些凭据存储在

C:\Users\$USER\AppData\Roaming\gcloud\application_default_credentials.json
Run Code Online (Sandbox Code Playgroud)

重新创建这些凭据的简便方法是使用该gcloud工具:

$ gcloud auth application-default login
Run Code Online (Sandbox Code Playgroud)

(请注意,gcloud auth login只设置使用该gcloud实用程序本身的凭据,而不是设置调用Google客户端库的应用程序,因此这不是必需的).

希望这可以节省几个小时的其他人.

  • 我可以确认这节省了我几个小时. (3认同)