dbt-bigquery: [CT-1094] [Bug] BigQuery `oauth-secrets` refresh token profile not authenticating
Describe the bug
I’ve tried to setup a oauth-secrets profile to connect with my BigQuery warehouse following the instruction on https://docs.getdbt.com/reference/warehouse-profiles/bigquery-profile#oauth-token-based.
However, I’m unable to authneticate when I try to do a dbt run -m <some model>
Steps To Reproduce
Here’s my profile,
bigquery_oauth:
target: dev
outputs:
dev:
type: bigquery
method: oauth-secrets
project: myproject
threads: 1
schema: dbt_varun
refresh_token: "myrefreshtoken"
client_id: myclientid
client_secret: myclientsecret
token_uri: https://www.googleapis.com/oauth2/v4/token
and I’ve specified this profile in my project yml and I’m running with dbt run -m <some model>.
Expected behavior
I would expect the model to run without issue.
Screenshots and log output
I get the following error
$ dbt run -m ./models/example/my_first_dbt_model
dbt run -m my_first_dbt_model
19:42:57 Running with dbt=1.2.1
19:42:57 Unable to do partial parsing because of a dbt version mismatch. Saved manifest version: 1.2.0. Current version: 1.2.1.
19:42:58 [WARNING]: Configuration paths exist in your dbt_project.yml file which do not apply to any resources.
There are 1 unused configuration paths:
- models.bigquery-integration.example
19:42:58 Found 2 models, 4 tests, 0 snapshots, 0 analyses, 285 macros, 0 operations, 12 seed files, 0 sources, 0 exposures, 0 metrics
19:42:58
19:43:00 Encountered an error:
Runtime Error
Unable to generate access token, if you're using impersonate_service_account, make sure your initial account has the "roles/iam.serviceAccountTokenCreator" role on the account you are trying to impersonate.
('invalid_scope: Bad Request', {'error': 'invalid_scope', 'error_description': 'Bad Request'})
19:43:00 Traceback (most recent call last):
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/dbt/adapters/bigquery/connections.py", line 194, in exception_handler
yield
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/dbt/adapters/bigquery/connections.py", line 611, in _retry_and_handle
return retry.retry_target(
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/google/api_core/retry.py", line 190, in retry_target
return target()
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/dbt/adapters/bigquery/impl.py", line 186, in query_schemas
return [ds.dataset_id for ds in all_datasets]
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/dbt/adapters/bigquery/impl.py", line 186, in <listcomp>
return [ds.dataset_id for ds in all_datasets]
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/google/api_core/page_iterator.py", line 208, in _items_iter
for page in self._page_iter(increment=False):
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/google/api_core/page_iterator.py", line 244, in _page_iter
page = self._next_page()
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/google/api_core/page_iterator.py", line 373, in _next_page
response = self._get_next_page_response()
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/google/api_core/page_iterator.py", line 432, in _get_next_page_response
return self.api_request(
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/google/cloud/bigquery/client.py", line 440, in api_request
return self._call_api(
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/google/cloud/bigquery/client.py", line 782, in _call_api
return call()
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/google/api_core/retry.py", line 283, in retry_wrapped_func
return retry_target(
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/google/api_core/retry.py", line 190, in retry_target
return target()
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/google/cloud/_http/__init__.py", line 482, in api_request
response = self._make_request(
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/google/cloud/_http/__init__.py", line 341, in _make_request
return self._do_request(
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/google/cloud/_http/__init__.py", line 379, in _do_request
return self.http.request(
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/google/auth/transport/requests.py", line 545, in request
self.credentials.before_request(auth_request, method, url, request_headers)
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/google/auth/credentials.py", line 133, in before_request
self.refresh(request)
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/google/oauth2/credentials.py", line 302, in refresh
) = reauth.refresh_grant(
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/google/oauth2/reauth.py", line 347, in refresh_grant
_client._handle_error_response(response_data)
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/google/oauth2/_client.py", line 62, in _handle_error_response
raise exceptions.RefreshError(error_details, response_data)
google.auth.exceptions.RefreshError: ('invalid_scope: Bad Request', {'error': 'invalid_scope', 'error_description': 'Bad Request'})
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/dbt/main.py", line 129, in main
results, succeeded = handle_and_check(args)
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/dbt/main.py", line 191, in handle_and_check
task, res = run_from_args(parsed)
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/dbt/main.py", line 238, in run_from_args
results = task.run()
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/dbt/task/runnable.py", line 470, in run
result = self.execute_with_hooks(selected_uids)
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/dbt/task/runnable.py", line 432, in execute_with_hooks
self.before_run(adapter, selected_uids)
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/dbt/task/run.py", line 442, in before_run
self.create_schemas(adapter, required_schemas)
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/dbt/task/runnable.py", line 555, in create_schemas
existing_schemas_lowered.update(ls_future.result())
File "/usr/lib/python3.10/concurrent/futures/_base.py", line 439, in result
return self.__get_result()
File "/usr/lib/python3.10/concurrent/futures/_base.py", line 391, in __get_result
raise self._exception
File "/usr/lib/python3.10/concurrent/futures/thread.py", line 58, in run
result = self.fn(*self.args, **self.kwargs)
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/dbt/utils.py", line 480, in connected
return func(*args, **kwargs)
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/dbt/task/runnable.py", line 532, in list_schemas
for s in adapter.list_schemas(database_quoted)
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/dbt/adapters/bigquery/impl.py", line 188, in list_schemas
return self.connections._retry_and_handle(msg="list dataset", conn=conn, fn=query_schemas)
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/dbt/adapters/bigquery/connections.py", line 610, in _retry_and_handle
with self.exception_handler(msg):
File "/usr/lib/python3.10/contextlib.py", line 153, in __exit__
self.gen.throw(typ, value, traceback)
File "/home/varun/dbt/dbt-integration-projects/bigquery-integration/venv/lib/python3.10/site-packages/dbt/adapters/bigquery/connections.py", line 213, in exception_handler
raise RuntimeException(message)
dbt.exceptions.RuntimeException: Runtime Error
Unable to generate access token, if you're using impersonate_service_account, make sure your initial account has the "roles/iam.serviceAccountTokenCreator" role on the account you are trying to impersonate.
('invalid_scope: Bad Request', {'error': 'invalid_scope', 'error_description': 'Bad Request'})
System information
The output of dbt --version:
dbt 1.2.1
The operating system you’re using: Linux
The output of python --version: 3.10.5
Additional context
I’m using a script to get the refresh token. I can confirm the refresh token is in fact valid – I’ve used another nodejs script with the nodejs bigquery library to connect with BigQuery without any issues. The script I’m using to get the refresh token is https://github.com/googleapis/nodejs-bigquery/blob/main/samples/auth-user-sample/authUserFlow.js with some very minor tweaks.
I’ve also use this script to get the access_token and I’ve setup a oauth-secrets temporary token profile. That profile works without any issues and I’m able to run dbt run -m <some model> on the same BigQuery warehouse and same dbt project.
bigquery_oauth_temp_token:
target: dev
outputs:
dev:
type: bigquery
method: oauth-secrets
project: myproject
threads: 1
schema: dbt_varun
token: "myaccesstoken"
About this issue
- Original URL
- State: closed
- Created 2 years ago
- Comments: 22 (7 by maintainers)
Hey there, I’m trying to reproduce the issue, but I’m still struggling with our OAuth setup. Hopefully it should be resolved soon 😉