【问题标题】:How to use service account generated key for authentication using googleapi client如何使用服务帐户生成密钥以使用 google api 客户端进行身份验证
【发布时间】:2020-05-15 04:48:16
【问题描述】:

我正在创建新的 google 服务帐户并希望使用新创建的服务帐户进行身份验证

def create_service_account(project_id, name, display_name):
"""Creates a service account."""

credentials = service_account.Credentials.from_service_account_file(
    filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
    scopes=['https://www.googleapis.com/auth/cloud-platform'])

service = googleapiclient.discovery.build(
    'iam', 'v1', credentials=credentials)

my_service_account = service.projects().serviceAccounts().create(
    name='projects/' + project_id,
    body={
        'accountId': name,
        'serviceAccount': {
            'displayName': display_name
        }
    }).execute()

print('Created service account: ' + my_service_account['email'])
return my_service_account

说我的服务帐户名称是 XXXX@com 我正在使用

为该服务帐户生成密钥
def create_key(service_account_email):
    """Creates a key for a service account."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
        scopes=['https://www.googleapis.com/auth/cloud-platform'])

    service = googleapiclient.discovery.build(
        'iam', 'v1', credentials=credentials)

    key = service.projects().serviceAccounts().keys().create(
        name='projects/-/serviceAccounts/' + service_account_email, body={}
        ).execute()

    print('Created key: ' + key['name'])

以上代码运行良好。

我想将新创建的服务帐户用于其他操作。 如何验证新创建的服务帐户? 除了这个

,还有其他方法可以创建凭据吗?
credentials = service_account.Credentials.from_service_account_file(
    filename=os.environ['GOOGLE_APPLICATION_CREDENTIALS'],
    scopes=['https://www.googleapis.com/auth/cloud-platform'])

service = googleapiclient.discovery.build(
    'iam', 'v1', credentials=credentials)

【问题讨论】:

    标签: python google-cloud-platform


    【解决方案1】:

    我推荐你使用默认的凭证方式,你的代码可以是这样的

    import google.auth
    
    credentials, project_id = google.auth.default()
    

    您有描述here。代码

    1. 首先检查GOOGLE_APPLICATION_CREDENTIALS 是否已定义。
    2. 如果没有,请检查您环境中的 gcloud 应用程序默认凭据。
    3. 如果没有,请检查代码是否在 GCP 环境下运行(如果元数据服务器存在)
    4. 错误

    这里,重要的是要注意第 2 点和第 3 点。

    • 在您的本地环境中,您不需要服务帐户密钥文件。您可以将自己的用户凭据与 GCLOUD 一起用作默认凭据
    • 在 GCP 环境中,您也不需要服务帐户密钥文件,因为您可以使用组件身份(查看组件文档以指定您想要的服务帐户电子邮件)

    最后,如果您的应用在非 GCP 环境中(在本地,在其他云提供商上),您必须使用服务帐户密钥文件并在环境变量中定义它。但是您不必在代码中显式调用它。再次,默认凭据有效!

    注意

    我强烈建议您避免生成服务帐户安全文件。这对保安来说是一场噩梦。它只是一个对您进行身份验证的文件。文件可以被复制、通过电子邮件发送,甚至可以提交到公共 git repo。此外,建议至少每 90 天轮换一次这些密钥文件 (...)。如果您不在 GCP 之外运行您的应用,请避免使用它,它会为您节省!

    编辑

    如果出现错误,那是因为您使用创建服务帐户密钥文件的答案作为密钥。这是一个常见的错误。您必须在答案中仅使用字段 privateKeyData 并对其进行解码(它的基数为 64)。

    那么您就有了一个有效的服务帐号 JSON 密钥文件。

    如果要使用密钥,则必须在创建凭证时提供此密钥

    # either you have save your json into a file
    credentials = service_account.Credentials.from_service_account_file(
        filename=/path/to/file/key.json,
        scopes=['https://www.googleapis.com/auth/cloud-platform'])
    
    # or if you have kept the json into memory and convert it into a dict
    credentials = service_account.Credentials.from_service_account_info(dict_json_key,
        scopes=['https://www.googleapis.com/auth/cloud-platform'])
    

    【讨论】:

    • 我的要求不同。我想在短时间内动态创建一个新的服务帐户并做一些事情。我从休息调用中获得了新生成的密钥-{“name”:“projects/project-id/serviceAccounts/service-account-email/keys/key-id”,“privateKeyType”:“TYPE_GOOGLE_CREDENTIALS_FILE”,“privateKeyData”:“private -key", "validAfterTime": "date", "validBeforeTime": "date", "keyAlgorithm": "KEY_ALG_RSA_2048" }-----------------我怎么用这个文件以获取我的凭据。获取ValueError:服务帐户信息不是预期的格式,缺少字段token_uri,..
    • 稍后我将删除密钥文件。
    • 我更新了我的答案。只是因为我很好奇,您需要动态创建密钥文件的用例是什么?
    猜你喜欢
    • 2019-08-25
    • 2017-10-24
    • 2019-01-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 2014-01-30
    • 2019-04-14
    相关资源
    最近更新 更多