我在一个小例子中运行此代码:
from google.cloud import storage
from google.appengine.api import app_identity
class TestB(base_handler.TRNHandler):
#...
def post(self):
client = storage.Client()
bucket_name = os.environ.get('BUCKET_NAME',
app_identity.get_default_gcs_bucket_name())
bucket = client.get_bucket(bucket_name)
#...
如果我部署此代码,一切都按预期工作。但是当我在本地运行它(SDK)时,我收到一个错误:未经授权:401凭证无效。发生了什么,我该如何解决?
答案 0 :(得分:2)
我有一个非常强烈的猜测,虽然我不能确定没有看到你的确切日志和诸如此类的东西。
google.cloud库非常了解授权。它使用一种称为“应用程序默认凭据”的东西。如果您在App Engine或GCE实例上运行该代码,代码将能够确定哪个服务帐户与该实例关联,并使用该帐户的凭据进行自我授权。
但是,当您在本地运行程序时,库无法知道要使用哪些凭据,因此它只是匿名调用。您的存储桶可能未授予匿名用户访问权限(这很好),因此调用失败并显示401。
但是,您可以使用gcloud命令在本地注册凭据:
$> gcloud auth application-default login
运行它,库将使用您用于登录一段时间的任何凭据。或者,您还可以确保环境变量GOOGLE_APPLICATION_CREDENTIALS
指向服务帐户的JSON密钥文件。
有很多关于Application Default Credentials如何选择凭据的文档。
或者,如果您希望在程序中指定auth right,you can do that too:
storage = Storage.from_service_account_json('/path/to/key_file.json')