如何以编程方式获取GCP承载令牌

时间:2017-09-28 10:14:58

标签: python google-cloud-platform google-container-registry

gcloud auth print-access-token给了我一个我以后可以使用的Bearer令牌。令牌看起来像: Authorization: Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg

如何在不使用gcloud的情况下获得这样的令牌,最好是通过一些python代码。

#!/usr/bin/python

from oauth2client.client import GoogleCredentials
credentials = GoogleCredentials.get_application_default()
credentials.get_access_token()
token1 = credentials.access_token
# magic piece of code to convert token1 into the 
# example Bearer ya29.AHES6ZRVmB7fkLtd1XTmq6mo0S1wqZZi3-Lh_s-6Uw7p8vtgSwg
# type.

1 个答案:

答案 0 :(得分:2)

您的代码段生成的令牌是标头所需的令牌。您应该只需设置"授权"标题为com.netflix.astyanax.connectionpool.exceptions.PoolTimeoutException: PoolTimeoutException: [host=104.197.131.17(104.197.131.17):9160, latency=10000(10000), attempts=1]Timed out waiting for connection at com.netflix.astyanax.connectionpool.impl.SimpleHostConnectionPool.waitForConnection(SimpleHostConnectionPool.java:231)

请注意,访问令牌会过期,因此如果您有一个长期存在的应用程序,则不能简单地存储访问令牌并继续使用它。最终,您将获得401,并且您必须获得新的访问令牌。

最佳做法是让HTTP调用自动处理401s以获得新的access_token。这通常也会为您处理缓存访问令牌,因此您不必担心这一点。事实上你可以这样做:

"Bearer "+token1

然后全天使用http = credentials.authorize(httplib2.Http()) 来处理您的请求,而不必担心访问令牌。