Python GAE SDK中存在未经授权的错误,但一旦部署就可以工作

Python GAE SDK中存在未经授权的错误,但一旦部署就可以工作,python,google-app-engine,google-cloud-storage,Python,Google App Engine,Google Cloud Storage,我在一个小示例中运行此代码: 从google.cloud导入存储 从google.appengine.api导入应用程序_identity 类TestB(基本处理器.TRNHandler): #... def post(自我): client=storage.client() bucket\u name=os.environ.get('bucket\u name', app\u identity.get\u default\u gcs\u bucket\u name()) bucket=clie

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

从google.cloud导入存储
从google.appengine.api导入应用程序_identity
类TestB(基本处理器.TRNHandler):
#...
def post(自我):
client=storage.client()
bucket\u name=os.environ.get('bucket\u name',
app\u identity.get\u default\u gcs\u bucket\u name())
bucket=client.get\u bucket(bucket\u名称)
#...

如果我部署这段代码,一切都会按预期工作。但是当我在本地运行它(SDK)时,我得到一个错误:Unauthorized:401无效凭据。发生了什么事,我该怎么解决呢?

我有一个很强的猜测,尽管我不能肯定,除非看到你的确切日志和诸如此类的东西

google.cloud库在授权方面很聪明。它使用一种称为“应用程序默认凭据”的东西。如果您在App Engine或GCE实例上运行该代码,该代码将能够确定哪个服务帐户与该实例关联,并使用该帐户的凭据对自己进行授权

但是,当您在本地运行程序时,库无法知道要使用哪些凭据,因此它只能匿名调用。您的bucket可能没有授予匿名用户访问权限(这很好),因此该调用会以401失败

但是,您可以使用gcloud命令在本地注册凭据:

$> gcloud auth application-default login
运行该命令,库将使用您登录一段时间所使用的任何凭据。或者,您还可以确保环境变量
GOOGLE\u APPLICATION\u CREDENTIALS
指向服务帐户的JSON密钥文件

有一大堆关于如何选择凭证的文档

或者,如果希望在程序中指定auth right,请执行以下操作:


我尝试使用gcloud命令,但仍然出现未经授权的错误。我还添加了:env_variables:GOOGLE_APPLICATION_CREDENTIALS:secrets/trn-test2-fc647b4d3b1a.json,但它只将错误更改为403调用者没有storage.bucket.get访问bucket应用程序_default_bucket。与上一种方法的结果相同。也许还有另一个问题?那就是进步,信不信由你。403表示您的呼叫已成功验证为您的帐户,但该帐户对bucket没有权限。字符串“app\u default\u bucket”很有趣,让我想想好吧,这是我给你的新理论。在开发服务器中本地运行时,调用“get_default_gcs_bucket_name()”将返回一个常量字符串“app_default_bucket”,而不是gcs app引擎bucket的实际名称。这样做的想法是,你可以写信给当地一个伪造的GCS版本进行测试。但是你使用的库确实是应用程序引擎伪造的;它试图联系真正的地面军事系统,但没有你可以访问的真正的“app\u default\u bucket”。我建议用桶的正确名称替换函数调用。谢谢,现在我已经取得了一些进展。你是对的,没有“app\u default\u bucket”(尽管这是我在cloudstorage中使用的)。我使用了client.list_bucket(),它给了我两个名称:trn-test2.appspot.com和staging.trn-test2.appspot.com。如果我使用其中任何一个作为bucket名称,它都会工作,但它会将图像上传到云端,而不是停留在本地开发空间中,这正是我所期望的。有没有一种方法可以让它“上传”到开发服务器(你可以在Blobstore查看器中看到的)或者我应该只使用临时存储桶?是的,这里的问题是“cloudstorage”库知道app engine开发服务器和提供的本地伪造版本的GCS,但是gcloud python库,虽然在许多其他方面更聪明,但事实并非如此。如果可能的话,我可能会建议只使用你的暂存桶。
storage = Storage.from_service_account_json('/path/to/key_file.json')