在没有配置文件的情况下验证 google API

Posted

技术标签:

【中文标题】在没有配置文件的情况下验证 google API【英文标题】:authenticate google API without a config file 【发布时间】:2020-05-26 11:11:05 【问题描述】:

我正在尝试,我什至找不到证据,除了我的服务中多年未使用的旧代码。

我的班级收到这个字典:

   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 environmentnt 变量时,一切正常:

os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = "config.json"
self.job_config = bigquery.QueryJobConfig()
self.job_config.use_legacy_sql = True

return bigquery.Client()

我不想要 env 变量的解决方案,我想使用没有文件路径的 Credentials 类

【问题讨论】:

我认为在使用from_service_account_info 方法时,您还需要通过_http 关键字对象传入requests.Session 的实例。见github.com/googleapis/python-bigquery/blob/master/google/cloud/… 【参考方案1】:

嗯,最后我设法让我的代码工作,而不需要任何全局变量或文件路径。我的配置凭据有问题...

这是代码 -

# 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)

我唯一缺少的部分是在我的所有查询中发送带有旧 SQL 设置为 true 的 QueryJobConfig 类。

【讨论】:

【参考方案2】:

不幸的是,没有其他方法可以在不使用环境变量或指定密钥文件路径的情况下验证您的 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 中的身份验证策略。

【讨论】:

以上是关于在没有配置文件的情况下验证 google API的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有用户身份验证的情况下列出 Google 日历活动

WordPress REST API - 如何在没有插件的情况下进行身份验证

用于向 Google API (Swift) 验证服务帐户的 JWT 签名无效

如何在没有 Oauth 的情况下访问 Google 客户端 API(仅 API 密钥)

在没有 OAuth 的情况下为自己的帐户使用 Google API

如何在未经身份验证的情况下从 Google Play 商店请求应用程序信息