环境/身份验证可能存在问题 - BigQuery 管理员:invalid_grant, Invalid JWT Signature
Posted
技术标签:
【中文标题】环境/身份验证可能存在问题 - BigQuery 管理员:invalid_grant, Invalid JWT Signature【英文标题】:Possible issue with environment / authentication - BigQuery Admin: invalid_grant, Invalid JWT Signature环境/身份验证可能存在问题 - BigQuery 管理员:invalid_grant, Invalid JWT Signature 【发布时间】:2020-10-12 03:54:05 【问题描述】:我第一次尝试使用 Python 访问 BigQuery API,并且正在遵循教程指南 here。我的最终目标是创建数据集,但我似乎无法访问基本的公共数据。
我使用以下内容创建了一个服务帐户:
BigQuery 管理员 BigQuery 数据所有者
使用此服务帐户,我生成了一个私钥 (.json) 并将其妥善保存在我的本地计算机上,并在我的 gcp_key_path
文件路径中引用它。
但是,在运行以下行时,我遇到了以下 jwt 问题。我在https://github.com/googleapis/google-cloud-python/issues/8736#event-2510884623 上看到了一个 GitHub 问题,表明 jwt 令牌过期可能是一个问题。我不确定如何检查这一点,也不确定在使用服务帐户发出此请求时是否自动设置。我检查了我的系统时间(Mac OS Catalina v10.15.6),似乎没有什么明显的问题。
如果有人以前遇到过这种情况,非常感谢外行对发生的事情的解释,以及可以帮助我了解如何解决此问题的指导(或指向文档的指针)。
import os
from google.cloud import bigquery
table_id = "[project_name].[file_name]"
file_path = '/path/to/my/data_file.json'
gcp_key_path = '/path/to/my/service/account/private/key.json'
# set the environment variable explicitly
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = gcp_key_path
# Construct a BigQuery client object.
client = bigquery.Client.from_service_account_json(gcp_key_path)
dataset_ref = client.dataset("hacker_news", project="bigquery-public-data")
dataset = client.get_dataset(dataset_ref)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/local/lib/python3.7/site-packages/google/cloud/bigquery/client.py", line 674, in get_dataset
timeout=timeout,
File "/usr/local/lib/python3.7/site-packages/google/cloud/bigquery/client.py", line 637, in _call_api
return call()
File "/usr/local/lib/python3.7/site-packages/google/api_core/retry.py", line 286, in retry_wrapped_func
on_error=on_error,
File "/usr/local/lib/python3.7/site-packages/google/api_core/retry.py", line 184, in retry_target
return target()
File "/usr/local/lib/python3.7/site-packages/google/cloud/_http.py", line 431, in api_request
timeout=timeout,
File "/usr/local/lib/python3.7/site-packages/google/cloud/_http.py", line 289, in _make_request
method, url, headers, data, target_object, timeout=timeout
File "/usr/local/lib/python3.7/site-packages/google/cloud/_http.py", line 327, in _do_request
url=url, method=method, headers=headers, data=data, timeout=timeout
File "/usr/local/lib/python3.7/site-packages/google/auth/transport/requests.py", line 460, in request
self.credentials.before_request(auth_request, method, url, request_headers)
File "/usr/local/lib/python3.7/site-packages/google/auth/credentials.py", line 133, in before_request
self.refresh(request)
File "/usr/local/lib/python3.7/site-packages/google/oauth2/service_account.py", line 361, in refresh
access_token, expiry, _ = _client.jwt_grant(request, self._token_uri, assertion)
File "/usr/local/lib/python3.7/site-packages/google/oauth2/_client.py", line 153, in jwt_grant
response_data = _token_endpoint_request(request, token_uri, body)
File "/usr/local/lib/python3.7/site-packages/google/oauth2/_client.py", line 124, in _token_endpoint_request
_handle_error_response(response_body)
File "/usr/local/lib/python3.7/site-packages/google/oauth2/_client.py", line 60, in _handle_error_response
raise exceptions.RefreshError(error_details, response_body)
google.auth.exceptions.RefreshError: ('invalid_grant: Invalid JWT Signature.', '"error":"invalid_grant","error_description":"Invalid JWT Signature."')
粘贴我的 pip freeze 的输出以防库可能已过时
beautifulsoup4==4.9.1
bs4==0.0.1
cachetools==4.1.0
certifi==2020.4.5.1
cffi==1.14.3
chardet==3.0.4
click==7.1.2
Flask==1.1.2
google-api-core==1.22.4
google-api-python-client==1.9.3
google-auth==1.22.1
google-auth-httplib2==0.0.3
google-cloud-bigquery==2.1.0
google-cloud-core==1.4.3
google-cloud-storage==1.29.0
google-crc32c==1.0.0
google-resumable-media==1.1.0
googleapis-common-protos==1.52.0
grpcio==1.32.0
httplib2==0.18.1
idna==2.9
itsdangerous==1.1.0
Jinja2==2.11.2
MarkupSafe==1.1.1
proto-plus==1.10.1
protobuf==3.12.2
psycopg2==2.8.5
pyasn1==0.4.8
pyasn1-modules==0.2.8
pycparser==2.20
pytz==2020.1
requests==2.23.0
rsa==4.6
six==1.15.0
soupsieve==2.0.1
SQLAlchemy==1.3.18
uritemplate==3.0.1
urllib3==1.25.9
Werkzeug==1.0.1
【问题讨论】:
1) 问题不是由无效的 JWT 签名引起的。 Google 客户端将在访问令牌过期之前刷新它以验证令牌。 2)您的问题很可能是过时的库版本。编辑您的问题并包含pip freeze
的结果。 3)我建议您使用virtualenv
,这样您就不会有多个项目使用冲突的库。
确保您安装了最新版本的 CLI:gcloud components update
。
感谢 John,我运行了 gcloud 组件更新并打印了 pip freeze 输出。我重新运行了脚本,但我仍然不断收到同样的错误。对于 (1),我怎么知道这是否正常工作?还有什么让你相信(2)是这里的罪魁祸首?感谢您的帮助。
Python 库要么是最新的,要么是最新的。创建一个环境,然后只需 pip install google-cloud-bigquery
。应安装所需的依赖项。
我认为这是库版本/冲突问题,因为与库合作多年。我还运行了您的代码,它可以在我的系统(Windows 10)上运行。这意味着您身边的环境问题。
【参考方案1】:
发现我的愚蠢错误。我忘记启用 BigQuery API 服务...快速入门中的第 (2) 步tutorial
【讨论】:
以上是关于环境/身份验证可能存在问题 - BigQuery 管理员:invalid_grant, Invalid JWT Signature的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Bigquery 在 Google Bigquery 中进行身份验证,而无需使用服务帐户进行用户输入
使用 R Markdown 文档中的 bigrquery 对 Bigquery 进行身份验证
在 Python 中运行 BigQuery SQL 查询,如何进行身份验证?
使用 bigquery 时增加 tidyverse API OAuth 令牌过期之前的时间?
通过 R Studio Server 使用 BigQuery 在 Google Compute Engine 上对服务帐户进行身份验证