File: //snap/google-cloud-cli/396/platform/bq/auth/main_credential_loader.py
#!/usr/bin/env python
"""Utilities to create Google Auth credentials."""
import logging
from typing import Union
from absl import app
from google.auth.compute_engine import credentials as compute_engine
from google.oauth2 import credentials as google_oauth2
from google.oauth2 import service_account
import bq_auth_flags
import bq_flags
import bq_utils
from auth import gcloud_credential_loader
from utils import bq_error
GoogleAuthCredentialsUnionType = Union[
google_oauth2.Credentials,
service_account.Credentials,
compute_engine.Credentials,
]
def GetCredentialsFromFlags() -> GoogleAuthCredentialsUnionType:
"""Returns credentials based on BQ CLI auth flags.
Returns: An OAuth2, compute engine, or service account credentials objects
based on BQ CLI auth flag values.
Raises:
app.UsageError, invalid flag values.
bq_error.BigqueryError, error getting credentials.
"""
if bq_auth_flags.APPLICATION_DEFAULT_CREDENTIAL_FILE.value:
raise app.UsageError(
'The --application_default_credential_file flag is being deprecated.'
' For now, this flag can still be used by forcing the legacy'
' authentication library with --nouse_google_auth.'
)
if (
bq_auth_flags.SERVICE_ACCOUNT_PRIVATE_KEY_PASSWORD.default
!= bq_auth_flags.SERVICE_ACCOUNT_PRIVATE_KEY_PASSWORD.value
):
raise app.UsageError(bq_error.P12_DEPRECATION_MESSAGE)
if bq_auth_flags.OAUTH_ACCESS_TOKEN.value:
logging.info('Loading auth credentials from --oauth_access_token')
return google_oauth2.Credentials(
token=bq_auth_flags.OAUTH_ACCESS_TOKEN.value,
quota_project_id=bq_utils.GetResolvedQuotaProjectID(
bq_auth_flags.QUOTA_PROJECT_ID.value, bq_flags.PROJECT_ID.value
),
)
else:
logging.info('No `oauth_access_token`, load credentials elsewhere')
if bq_auth_flags.USE_GCE_SERVICE_ACCOUNT.value:
logging.info('Loading auth credentials with --use_gce_service_account')
return compute_engine.Credentials(
quota_project_id=bq_utils.GetResolvedQuotaProjectID(
bq_auth_flags.QUOTA_PROJECT_ID.value, bq_flags.PROJECT_ID.value
),
)
else:
logging.info('No `use_gce_service_account`, load credentials elsewhere')
if bq_auth_flags.SERVICE_ACCOUNT.value:
raise app.UsageError(
'The flag --service_account is not supported. '
'To use a service account please follow'
' https://cloud.google.com/docs/authentication/'
'use-service-account-impersonation#gcloud-config.'
)
return gcloud_credential_loader.LoadCredential()