我想在python中构建客户端gcp工具。
我想避免通过glcoud
来调用subprocess
工具,因此我选择了sdk client library调用。
根据文档也是this非常全面的文章,auth有两种选择:
a)使用应用程序默认凭据(即gcloud
在后台使用的凭据)
b)使用服务帐户并将应用程序指向相应的.json
文件。
我已经尝试过(a)并收到以下警告:
UserWarning:您的应用程序已使用最终用户进行身份验证 来自Google Cloud SDK的凭据。我们建议大多数服务器 应用程序改为使用服务帐户。如果您的申请 继续使用Cloud SDK中的最终用户凭据,您可能 收到“超出配额”或“未启用API”错误。欲了解更多 有关服务帐户的信息,请参阅 https://cloud.google.com/docs/authentication/
warnings.warn(_CLOUD_SDK_CREDENTIALS_WARNING)
如果我使用应用程序默认凭据,这将很容易,因为将向该应用程序分发的每个最终用户都将这个.json
文件作为其身份验证过程的真实来源。但是,该应用可能会遇到上述quota exceeded
错误。
在另一种情况下,(特定于服务帐户的凭据)我假设我必须向每个开发人员提供说明,以发出与服务帐户具有与他/她完全相同的权限的json文件。那更新过程呢?每次为用户分配/撤消某些权限时会发生什么?这个json如何保持同步?
任何对此的建议将不胜感激。
答案 0 :(得分:4)
应用程序默认凭据(ADC)有几种类型:用户帐户和服务帐户以及它们的变体。问题中的警告消息表示您已使用用户帐户凭据(gcloud auth login
)设置了SDK CLI。我建议切换到服务帐户凭据。
此命令将使用服务帐户设置CLI。您将需要您的项目ID和服务帐户JSON文件。
gcloud auth activate-service-account test@PROJECT_ID.iam.gserviceaccount.com --key-file=service_account.json
我写了一篇文章,详细介绍了如何设置CLI:
Setting up Gcloud with Service Account Credentials
为什么Google会警告您
但是,鉴于上述详细信息,您的用例正在为您的用户提供凭据。这不是一个好主意。我将继续使用与您的Web前端对话的用户凭据。您的Web前端使用用户从未见过的服务帐户,并提供最终服务(API)访问权限。
[更新]
我刚刚注意到您的评论,即您正在开发自己的CLI。如果没有此CLI将访问哪些项目/服务的更多详细信息,您可能会考虑使用与您的服务对话的用户凭据,该凭据向用户颁发访问令牌。该令牌仅可使用一小时。您可以在代码中支持刷新此令牌。这使您能够使用用户身份验证,控制服务帐户的使用并仍然保持良好的安全性。请注意,我试图避免您将服务帐户文件直接分发给用户。如果这些用户是您自己的员工,那么问题就不大了。对于不受您控制的人,请仔细考虑。
[END UPDATE]
我将尝试提供有关您的问题的详细信息和建议。在确定最适合您的策略时,请考虑我以前的评论。
在另一种情况下,(假定服务帐户专用凭据)我 将必须向每个开发人员提供说明以发出json 与完全相同的服务帐户对应的文件 他/她的权限。
如果我要编写一个使用服务帐户凭据的应用程序,我将创建一种方法来加载/安装凭据。只需提供一个文件,并告诉他们在程序中执行此步骤即可。但是,您有一个问题。将相同的服务帐户分配给所有用户不是一个好主意。您如何处理吊销等?并非将Google Cloud Platform服务帐户设计为唯一地分配给每个项目的几十或数百个用户。
那更新过程如何?
服务帐户凭据JSON密钥文件不会过期。从服务帐户创建的令牌确实会过期,但这由Google客户端库或您自己的代码进行管理,以自动刷新它们。
每次为用户分配/撤消某些权限时会发生什么? 该JSON如何保持同步?
服务帐户文件不包含权限。这些存储在Google Cloud IAM中。修改分配给服务帐户的角色后,这些角色将在几分钟之内透明地全局应用。
答案 1 :(得分:1)
如果仅预期该工具可以交互使用(例如替换gcloud),则使用默认凭据可能会很好,因为使用率较低。
也就是说,为服务帐户创建密钥是在控制台中或通过gcloud进行的相当简单的操作,并且API使之reasonably easy to consume the key –您基本上设置了GOOGLE_APPLICATION_CREDENTIALS
环境变量。在this page中查看更多信息。使用服务帐户还可以使您准确地分配所需的角色,而不是使用用户帐户可能具有的广泛权限进行操作,并且这减少了在代码执行不应执行的操作时出错的可能性。