使用云存储时在 dev_appserver 上获取访问令牌刷新错误 'invalid_grant'

Getting AccessTokenRefreshError 'invalid_grant' on dev_appserver when using cloudstorage

尝试 Google Cloud Storage sample 时(或在其他项目中使用 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',)

问题是,当我将应用程序部署到 Google App Engine 时,调用工作正常。

我花了几个小时搜索和调试客户端代码,直到我发现 oauth2client 正在使用存储在文件系统某处的一些 default application credentials。似乎这些凭据可能是以前版本的 GAE SDK 遗留下来的,包括一个旧的刷新令牌,该令牌被 Google.

拒绝了

在 windows 时,这些凭据存储在

C:\Users$USER\AppData\Roaming\gcloud\application_default_credentials.json

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

$ gcloud auth application-default login

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

希望这可以为其他人节省几个小时。