Source code for pysasl.creds.external
from typing import Optional, Sequence, NoReturn
from typing_extensions import Final
from .server import ServerCredentials
from ..exception import AuthenticationError
from ..identity import Identity
__all__ = ['ExternalVerificationRequired', 'ExternalCredentials']
[docs]class ExternalVerificationRequired(AuthenticationError):
"""The credentials are structurally valid but require external
verification.
If *token* is ``None``, the credentials provided no additional information
for verification. Otherwise, *token* should be verified and authorized for
*identity*.
Args:
identity: The identity resolved from the credentials.
token: A bearer token, if required for verification.
"""
__slots__: Sequence[str] = ['identity', 'token']
def __init__(self, identity: Optional[Identity],
token: Optional[str] = None) -> None:
super().__init__()
self.identity: Final = identity
self.token: Final = token
[docs]class ExternalCredentials(ServerCredentials):
"""Credentials that require external verification, rather than by a
traditional hashing algorithm.
Args:
authzid: Authorization ID string.
token: A bearer token, if required for verification.
"""
__slots__: Sequence[str] = ['_authzid', '_token']
def __init__(self, authzid: str, token: Optional[str] = None) -> None:
super().__init__()
self._authzid = authzid
self._token = token
@property
def authcid(self) -> str:
return ''
@property
def authzid(self) -> str:
return self._authzid
[docs] def verify(self, identity: Optional[Identity]) -> NoReturn:
"""This method always throws :exc:`ExternalVerificationRequired`. For
applications to support these types of credentials, they must catch
this exception and use it to authenticate and authorize the request.
Args:
identity: The identity being authenticated.
Raises:
ExternalVerificationRequired: Always thrown.
"""
raise ExternalVerificationRequired(identity, self._token)
def __repr__(self) -> str:
return f'ExternalCredentials({self.authzid}, ...)'