Source code for simple_openid_connect.flows.direct_access_grant.client
from typing import TYPE_CHECKING, Union
from simple_openid_connect.data import TokenErrorResponse, TokenSuccessResponse
from simple_openid_connect.exceptions import UnsupportedByProviderError
from simple_openid_connect.flows import direct_access_grant as impl
if TYPE_CHECKING:
from simple_openid_connect.client import OpenidClient
[docs]
class DirectAccessGrantClient:
"""
A client that implements *Direct Access Grant* (or *Resource Owner Password Credentials Grant*) functionality.
It is exposed via :data:`OpenidClient.authorization_code_flow <simple_openid_connect.client.OpenidClient.direct_access_grant>`.
"""
[docs]
def __init__(self, base_client: "OpenidClient"):
self._base_client = base_client
[docs]
def authenticate(
self, username: str, password: str
) -> Union[TokenSuccessResponse, TokenErrorResponse]:
"""
Exchange a given username and password for access, refresh and id tokens.
:returns: The result of the exchange
"""
if self._base_client.provider_config.token_endpoint is None:
raise UnsupportedByProviderError(
f"The OpenID provider {self._base_client.provider_config.issuer} only seems to support the implicit flow and does not have a token endpoint"
)
return impl.authenticate(
token_endpoint=self._base_client.provider_config.token_endpoint,
scope=self._base_client.scope,
username=username,
password=password,
client_authentication=self._base_client.client_auth,
)