我正在尝试在没有配置文件的情况下对google API进行身份验证,我什至找不到证据证明这是可能的,但多年来我的服务中没有使用过旧代码。
我的班级收到这个字典:
self._connection_data = {
"type": args,
"project_id": args,
"private_key_id": args,
"private_key": args,
"client_email": args,
"client_id": args,
"auth_uri": args,
"token_uri": args,
"auth_provider_x509_cert_url": args,
"client_x509_cert_url": args
}
,代码是-
from google.cloud import bigquery
from google.oauth2 import service_account
def _get_client(self):
credentials = service_account.Credentials.from_service_account_info(self._connection_data)
return bigquery.Client(project=self._project_id, credentials=credentials, location='US')
我收到错误
'{"error":"invalid_grant","error_description":"Invalid grant: account not found"}
但是,当我使用名为config.json的配置的帮助文件和OS环境变量时,一切正常:
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = "config.json"
self.job_config = bigquery.QueryJobConfig()
self.job_config.use_legacy_sql = True
return bigquery.Client()
我不需要env变量的解决方案,我想使用没有文件路径的Credentials类
答案 0 :(得分:1)
不幸的是,没有其他方法可以不使用环境变量或指定密钥文件路径来验证API请求。有一些使用密钥json文件通过GCP验证您的请求的方法。首先,您应该先设置服务帐户并使用密钥下载json文件,如here所述。
然后,根据documentation,第一种方法是使用默认凭据:
如果在构建客户端时未指定凭据,则 客户端库将在环境中查找凭据。
这意味着,您只需要设置环境变量。然后,Google客户端库将隐式确定凭据。此外,它还允许您与应用程序分开提供凭据,从而简化了代码更改过程。您可以如下设置环境变量:
export GOOGLE_APPLICATION_CREDENTIALS="/home/user/Downloads/[FILE_NAME].json"
设置后,您将可以运行以下code:
def implicit():
from google.cloud import storage
# If you don't specify credentials when constructing the client, the
# client library will look for credentials in the environment.
storage_client = storage.Client()
# Make an authenticated API request
buckets = list(storage_client.list_buckets())
print(buckets)
第二,您可以使用[google.oauth2.service_account][3]
模块在代码中指定文件路径。 documentation中指出:
OAuth 2.0客户端识别应用程序并允许最终用户 向Google验证您的应用程序。它允许您的应用 代表最终用户访问Google Cloud API。
要使用该模块,可以使用以下两个代码之一:
#It creates credentials using your .json file and the Credentials.from_service_account_file constructor
credentials = service_account.Credentials.from_service_account_file(
'service-account.json')
或
#If you set the environment variable, you can also use
#info = json.loads(os.environ['GOOGLE_APPLICATION_CREDENTIALS_JSON_STRING'])
#Otherwise, you specify the path inside json.load() as below
service_account_info = json.load(open('service_account.json'))
credentials = service_account.Credentials.from_service_account_info(
service_account_info)
最后,我建议您在documentation中检查“身份验证”策略。
答案 1 :(得分:0)
好吧,最后我设法使我的代码正常工作,而无需使用全局变量或文件路径。我配置的凭据有问题...
这是代码-
# init class here
self.job_config = bigquery.QueryJobConfig()
self.job_config.use_legacy_sql = True
def _get_client(self):
credentials = service_account.Credentials.from_service_account_info(self._connection_data)
return bigquery.Client(project=self._project_id, credentials=credentials)
# function to get columns
query_job = self._get_client().query(query, job_config=self.job_config)
results = query_job.result(timeout=self._current_timeout)
我唯一缺少的部分是发送QueryJobConfig类,并将所有查询中的旧版SQL设置为true。