我想在python中构建一个客户端gcp工具。
我希望避免通过glcoud调用subprocess工具,所以我选择了sdk 客户库调用。
根据docs以及这非常全面的文章,对于auth有两种选择:
( a)使用应用程序默认凭据(即gcloud在外壳下使用的凭据)
( b)使用服务帐户并将应用程序指向相应的.json文件。
我已尝试过(a)项,并收到以下警告:
UserWarning:您的应用程序已经使用Google的最终用户凭据进行了身份验证。我们建议大多数服务器应用程序使用服务帐户。如果应用程序继续使用Cloud的最终用户凭据,则可能会收到“超出配额”或"API未启用“错误。有关服务帐户的详细信息,请参阅https://cloud.google.com/docs/authentication/。 warnings.warn(_CLOUD_SDK_CREDENTIALS_WARNING)
如果我使用应用程序默认的creds,这将使它很容易,因为每个最终用户将该应用程序分发给,将这个.json文件作为他/她的第四个进程的真相来源。然而,应用程序可能会遇到上述quota exceeded错误。
在另一种情况下,(特定于服务帐户的凭据),我假设我必须向每个开发人员提供指示,以发出一个json文件,该文件对应于与他/她的权限完全相同的服务帐户。那么更新过程呢?当用户每次被分配/撤销某些权限时会发生什么情况?这个json是如何保持同步的?
任何有关这方面的建议都将不胜感激。
发布于 2019-10-13 21:00:17
有几种类型的应用程序默认凭据(ADC):用户帐户和服务帐户以及这些帐户的变体。问题中的警告消息意味着您使用用户帐户凭据(gcloud auth login)设置了SDK。我建议切换到服务帐户凭据。
此命令将使用服务帐户设置CLI。您将需要项目ID和服务帐户JSON文件。
gcloud auth activate-service-account test@PROJECT_ID.iam.gserviceaccount.com --key-file=service_account.json我写了一篇关于如何设置CLI的详细文章:
为什么谷歌会给你一个警告:
但是,鉴于上述细节,您的用例正在为用户提供凭据。这不是个好主意。我将继续使用用户凭据与您的网站前端交谈。您的web前端使用用户从未看到并提供最终服务(API)访问的服务帐户。
更新
我刚刚注意到您的评论,您正在开发自己的CLI。如果没有更多关于这个CLI将访问哪些项目/服务的详细信息,您可能会考虑使用与您的服务对话的用户凭据,这将向用户发出访问令牌。此令牌仅有效一个小时。您可以在代码中支持刷新此令牌。这使您能够使用用户身份验证,控制服务帐户的使用,并仍然保持良好的安全性。请注意,我正试图引导您避免直接将服务帐户文件分发给用户。如果这些用户是您自己的员工,这就不是什么问题了。对那些不在你控制之下的人来说,要仔细考虑。
结束更新
我会尽力提供你的问题的细节和建议。在为你决定最佳策略时,一定要考虑我先前的评论。
在另一种情况下,(特定于服务帐户的凭据),我假设我必须向每个开发人员提供指示,以发出一个json文件,该文件对应于与他/她的权限完全相同的服务帐户。
如果要编写使用服务帐户凭据的应用程序,我将创建一个加载/安装凭据的方法。只需提供一个文件并告诉他们在程序中执行这个步骤。然而,你有一个问题。向所有用户分发相同的服务帐户并不是一个好主意。你如何处理撤销等?服务帐户的设计并不能唯一地分配给每个项目几十个或数百个用户。
那么更新过程呢?
服务帐户凭据JSON密钥文件不会过期。从服务帐户创建的令牌确实过期,但这是由Google客户端库管理的,或者是在您自己的代码中自动刷新它们。
当用户每次被分配/撤销某些权限时会发生什么情况?这个JSON是如何保持同步的?
服务帐户文件不包含权限。这些存储在中。一旦修改了分配给服务帐户的角色,就会在几分钟内透明地在全局应用它们。
https://stackoverflow.com/questions/58366923
复制相似问题