Source code for memcachio.authentication
from __future__ import annotations
from abc import ABC, abstractmethod
from typing import TYPE_CHECKING
from .commands import SetCommand
if TYPE_CHECKING:
from .connection import BaseConnection
[docs]
class Authenticator(ABC):
"""
Abstract class for authentication strategy used by
:class:`memcachio.BaseConnection`.
"""
[docs]
@abstractmethod
async def authenticate(self, connection: BaseConnection) -> bool:
"""
The method that will be called immediately after a connection
is established to the server. This should perform any authentication
handshake required by the server. See :class:`memcachio.SimpleAuthenticator`
for an example.
:param connection: The connection instance that was established
"""
...
[docs]
class SimpleAuthenticator(Authenticator):
"""
A username/password authentication strategy for the ASCII
protocol as defined in the `memcached protocol documentation
<https://github.com/memcached/memcached/blob/master/doc/protocol.txt#L186>`_.
"""
def __init__(self, username: str, password: str):
self.username = username
self.password = password
[docs]
async def authenticate(self, connection: BaseConnection) -> bool:
"""
Authenticate the connection using a fake ``set`` command with the
username and password as the payload.
"""
auth_command = SetCommand("auth", f"{self.username} {self.password}")
connection.create_request(auth_command)
return await auth_command.response
class MemCachierAuthenticator(SimpleAuthenticator):
"""
A username/password authentication strategy for the ASCII
protocol as defined by the `MemCachier documentation
<https://www.memcachier.com/documentation/supported-protocols-ascii-binary>_
To use with a memcachier instance::
from memcachio import Client
from memcachio.authentication import MemCachierAuthenticator
mc_auth = MemCachierAuthenticator("your-memcachier-username", "your-memcachier-password")
client = Client(("mcXXX.dev.ec2.memcachier.com", 11211), authenticator=mc_auth)
"""
async def authenticate(self, connection: BaseConnection) -> bool:
"""
Authenticate the connection using a ``set`` command with the
username as the key and password as the payload.
"""
auth_command = SetCommand(self.username, self.password)
connection.create_request(auth_command)
return await auth_command.response