GAE SDK中未经授权的错误,但部署后仍然有效

时间:2017-01-31 00:56:23

标签: python google-app-engine google-cloud-storage

我在一个小例子中运行此代码:

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凭证无效。发生了什么,我该如何解决?

1 个答案:

答案 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')