使用云存储时在 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 客户端库的应用程序设置凭据,因此此处不需要) .
希望这可以为其他人节省几个小时。
尝试 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 客户端库的应用程序设置凭据,因此此处不需要) .
希望这可以为其他人节省几个小时。