| # Copyright 2024 Google LLC |
| # |
| # 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. |
| |
| |
| """Interface for base credentials.""" |
| |
| import abc |
| |
| from google.auth import _helpers |
| |
| |
| class _BaseCredentials(metaclass=abc.ABCMeta): |
| """Base class for all credentials. |
| |
| All credentials have a :attr:`token` that is used for authentication and |
| may also optionally set an :attr:`expiry` to indicate when the token will |
| no longer be valid. |
| |
| Most credentials will be :attr:`invalid` until :meth:`refresh` is called. |
| Credentials can do this automatically before the first HTTP request in |
| :meth:`before_request`. |
| |
| Although the token and expiration will change as the credentials are |
| :meth:`refreshed <refresh>` and used, credentials should be considered |
| immutable. Various credentials will accept configuration such as private |
| keys, scopes, and other options. These options are not changeable after |
| construction. Some classes will provide mechanisms to copy the credentials |
| with modifications such as :meth:`ScopedCredentials.with_scopes`. |
| |
| Attributes: |
| token (Optional[str]): The bearer token that can be used in HTTP headers to make |
| authenticated requests. |
| """ |
| |
| def __init__(self): |
| self.token = None |
| |
| @abc.abstractmethod |
| def refresh(self, request): |
| """Refreshes the access token. |
| |
| Args: |
| request (google.auth.transport.Request): The object used to make |
| HTTP requests. |
| |
| Raises: |
| google.auth.exceptions.RefreshError: If the credentials could |
| not be refreshed. |
| """ |
| # pylint: disable=missing-raises-doc |
| # (pylint doesn't recognize that this is abstract) |
| raise NotImplementedError("Refresh must be implemented") |
| |
| def _apply(self, headers, token=None): |
| """Apply the token to the authentication header. |
| |
| Args: |
| headers (Mapping): The HTTP request headers. |
| token (Optional[str]): If specified, overrides the current access |
| token. |
| """ |
| headers["authorization"] = "Bearer {}".format( |
| _helpers.from_bytes(token or self.token) |
| ) |