如何使用Python中的服务帐户验证Google Cloud?

use*_*823 14 oauth-2.0 google-bigquery service-accounts google-cloud-platform

我试图制作一个项目,将谷歌存储json文件上传到BigQuery(只是自动完成现在手动完成的事情).

我希望使用"服务帐户",因为我的脚本将每天运行.

阅读完所有关于使用服务帐户的内容后,我仍然在努力进行身份验证.

我想知道是否有人可以检查并指出我错过了什么?

这是我到目前为止所做的:

  1. 为服务帐户创建了json密钥文件
  2. 已安装的客户端库: pip install --upgrade google-cloud-bigquery
  3. 根据以下网址安装了google cloud sdk:https://cloud.google.com/sdk/docs/
  4. 运行export GOOGLE_APPLICATION_CREDENTIALS=<path_to_service_account_file>与正确指定键路径

现在我试图运行以下python脚本:

from google.cloud import bigquery
bigquery_client = bigquery.Client()
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

google.auth.exceptions.DefaultCredentialsError:无法自动确定凭据.请设置GOOGLE_APPLICATION_CREDENTIALS或明确创建凭据并重新运行该应用程序.有关详细信息,请参阅 https://developers.google.com/accounts/docs/application-default-credentials.

我对python和google云API都很陌生,所以可能错过了一些东西,

不知道是否有人可以指出我上面的步骤中哪里出现了什么/出了什么问题,或者让我明确指出dummys使用服务帐户设置和运行Bigquery的简单脚本?

Wil*_*uks 23

我通常在python脚本本身设置这个变量,如:

import os
from google.cloud.bigquery.client import Client

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = 'path_to_json_file'
bq_client = Client()
Run Code Online (Sandbox Code Playgroud)

  • @Madhi 请发布您的解决方案供其他人查看 (7认同)

tar*_*kki 10

如果您对服务帐户权限实施了更细粒度的控制,并且您有一个应用程序需要使用其中几个(例如,一个用于发布/订阅,一个用于存储),那么您必须GOOGLE_APPLICATION_CREDENTIALS在创建每个应用程序之前设置环境变量客户。

相反,您可以单独加载凭据,然后将其传递给相应的客户端,如下所示:

import json

from google.cloud import storage
from google.oauth2 import service_account

project_id = 'my-test-project'

with open('/path/to/my/service_keys/storage_service.json') as source:
    info = json.load(source)

storage_credentials = service_account.Credentials.from_service_account_info(info)

storage_client = storage.Client(project=project_id, credentials=storage_credentials)
Run Code Online (Sandbox Code Playgroud)

只需在IAM控制台中确保该帐户具有执行所需操作所需的正确权限,但是幸运的是,在这种情况下,错误消息确实很有用。


Man*_*u N 6

我只是将凭据设置为 python 代码中的变量,但直接在 python 代码中显示凭据并不是一个好主意:)

#!pip install google-api-python-client
#!pip install google-cloud-dns

from google.oauth2 import service_account
from googleapiclient import discovery
from google.cloud import dns


#Downloaded credentials in JSON format
gcp_sa_credentials={
  "type": "service_account",
  "project_id": "mygcpprojectid-1122",
  "private_key_id": "myprivkeyid",
  "private_key": "-----BEGIN PRIVATE KEY-----\nmyprivatekey\n-----END PRIVATE KEY-----\n",
  "client_email": "client-mail@mygcpprojectid-1122.iam.gserviceaccount.com",
  "client_id": "myclientid",
  "auth_uri": "https://accounts.google.com/o/oauth2/auth",
  "token_uri": "https://oauth2.googleapis.com/token",
  "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
  "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/client-mail%40mygcpprojectid-1122.iam.gserviceaccount.com"
}

project_id=gcp_sa_credentials["project_id"]

credentials = service_account.Credentials.from_service_account_info(gcp_sa_credentials)
client = dns.Client(project=project_id,credentials=credentials)
Run Code Online (Sandbox Code Playgroud)


Mat*_*ens 5

您是否在与使用export设置环境变量的命令行会话相同的命令行会话中运行脚本?如果没有,您可能要考虑为您的用户或系统设置它(有关更多信息,请参阅此问题)。

另一个可能使事情变得更加简单并自动处理这些事情的选项是使用gcloud cli工具。如果您在“ 应用程序默认凭据”的工作方式下查看此处的第二个选项,则可以找到有关如何使用它来为您管理凭据的信息(和)。gcloud auth logingcloud auth application-default login

  • 就我而言,“gcloud auth application-default login”命令是正确的(且非显而易见的)解决方案。谢谢! (2认同)

Chr*_*row 5

这是一个老问题,但我想补充一点,您必须创建一个新的服务帐户,而不是使用旧的服务帐户。最近的 Google Cloud Next 安全演示指出,不能保证默认服务帐户将来会存在,并且可以随时删除它(或其可用权限发生更改),因此您的任何应用程序都不应该依赖它。我还发现,使用默认服务帐户时存在潜在的身份验证问题,而创建一个新帐户更有可能允许您成功进行身份验证所需的控制。

请参阅以下 YouTube 演示文稿(11 分 10 秒):

https://youtu.be/ZQHoC0cR6Qw?t=670