norae
/
docker
/deezer-spleeter-env
/lib
/python3.10
/site-packages
/google_auth_oauthlib
/helpers.py
| # Copyright 2017 Google Inc. | |
| # | |
| # Licensed under the Apache License, Version 2.0 (the "License"); | |
| # you may not use this file except in compliance with the License. | |
| # You may obtain a copy of the License at | |
| # | |
| # http://www.apache.org/licenses/LICENSE-2.0 | |
| # | |
| # Unless required by applicable law or agreed to in writing, software | |
| # distributed under the License is distributed on an "AS IS" BASIS, | |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| # See the License for the specific language governing permissions and | |
| # limitations under the License. | |
| """Integration helpers. | |
| This module provides helpers for integrating with `requests-oauthlib`_. | |
| Typically, you'll want to use the higher-level helpers in | |
| :mod:`google_auth_oauthlib.flow`. | |
| .. _requests-oauthlib: http://requests-oauthlib.readthedocs.io/en/latest/ | |
| """ | |
| import datetime | |
| import json | |
| from google.auth import external_account_authorized_user | |
| import google.oauth2.credentials | |
| import requests_oauthlib | |
| _REQUIRED_CONFIG_KEYS = frozenset(("auth_uri", "token_uri", "client_id")) | |
| def session_from_client_config(client_config, scopes, **kwargs): | |
| """Creates a :class:`requests_oauthlib.OAuth2Session` from client | |
| configuration loaded from a Google-format client secrets file. | |
| Args: | |
| client_config (Mapping[str, Any]): The client | |
| configuration in the Google `client secrets`_ format. | |
| scopes (Sequence[str]): The list of scopes to request during the | |
| flow. | |
| kwargs: Any additional parameters passed to | |
| :class:`requests_oauthlib.OAuth2Session` | |
| Raises: | |
| ValueError: If the client configuration is not in the correct | |
| format. | |
| Returns: | |
| Tuple[requests_oauthlib.OAuth2Session, Mapping[str, Any]]: The new | |
| oauthlib session and the validated client configuration. | |
| .. _client secrets: | |
| https://github.com/googleapis/google-api-python-client/blob/main/docs/client-secrets.md | |
| """ | |
| if "web" in client_config: | |
| config = client_config["web"] | |
| elif "installed" in client_config: | |
| config = client_config["installed"] | |
| else: | |
| raise ValueError("Client secrets must be for a web or installed app.") | |
| if not _REQUIRED_CONFIG_KEYS.issubset(config.keys()): | |
| raise ValueError("Client secrets is not in the correct format.") | |
| session = requests_oauthlib.OAuth2Session( | |
| client_id=config["client_id"], scope=scopes, **kwargs | |
| ) | |
| return session, client_config | |
| def session_from_client_secrets_file(client_secrets_file, scopes, **kwargs): | |
| """Creates a :class:`requests_oauthlib.OAuth2Session` instance from a | |
| Google-format client secrets file. | |
| Args: | |
| client_secrets_file (str): The path to the `client secrets`_ .json | |
| file. | |
| scopes (Sequence[str]): The list of scopes to request during the | |
| flow. | |
| kwargs: Any additional parameters passed to | |
| :class:`requests_oauthlib.OAuth2Session` | |
| Returns: | |
| Tuple[requests_oauthlib.OAuth2Session, Mapping[str, Any]]: The new | |
| oauthlib session and the validated client configuration. | |
| .. _client secrets: | |
| https://github.com/googleapis/google-api-python-client/blob/main/docs/client-secrets.md | |
| """ | |
| with open(client_secrets_file, "r") as json_file: | |
| client_config = json.load(json_file) | |
| return session_from_client_config(client_config, scopes, **kwargs) | |
| def credentials_from_session(session, client_config=None): | |
| """Creates :class:`google.oauth2.credentials.Credentials` from a | |
| :class:`requests_oauthlib.OAuth2Session`. | |
| :meth:`fetch_token` must be called on the session before before calling | |
| this. This uses the session's auth token and the provided client | |
| configuration to create :class:`google.oauth2.credentials.Credentials`. | |
| This allows you to use the credentials from the session with Google | |
| API client libraries. | |
| Args: | |
| session (requests_oauthlib.OAuth2Session): The OAuth 2.0 session. | |
| client_config (Mapping[str, Any]): The subset of the client | |
| configuration to use. For example, if you have a web client | |
| you would pass in `client_config['web']`. | |
| Returns: | |
| google.oauth2.credentials.Credentials: The constructed credentials. | |
| Raises: | |
| ValueError: If there is no access token in the session. | |
| """ | |
| client_config = client_config if client_config is not None else {} | |
| if not session.token: | |
| raise ValueError( | |
| "There is no access token for this session, did you call " "fetch_token?" | |
| ) | |
| if "3pi" in client_config: | |
| credentials = external_account_authorized_user.Credentials( | |
| token=session.token["access_token"], | |
| refresh_token=session.token.get("refresh_token"), | |
| token_url=client_config.get("token_uri"), | |
| client_id=client_config.get("client_id"), | |
| client_secret=client_config.get("client_secret"), | |
| token_info_url=client_config.get("token_info_url"), | |
| scopes=session.scope, | |
| ) | |
| else: | |
| credentials = google.oauth2.credentials.Credentials( | |
| session.token["access_token"], | |
| refresh_token=session.token.get("refresh_token"), | |
| id_token=session.token.get("id_token"), | |
| token_uri=client_config.get("token_uri"), | |
| client_id=client_config.get("client_id"), | |
| client_secret=client_config.get("client_secret"), | |
| scopes=session.scope, | |
| granted_scopes=session.token.get("scope"), | |
| ) | |
| credentials.expiry = datetime.datetime.utcfromtimestamp(session.token["expires_at"]) | |
| return credentials | |