无需配置文件即可对Google API进行身份验证

时间:2020-05-26 11:11:05

标签: python google-api google-bigquery google-api-client

我正在尝试在没有配置文件的情况下对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类

2 个答案:

答案 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。