import base64 import binascii from starlette.authentication import ( AuthCredentials, AuthenticationBackend, AuthenticationError, SimpleUser ) class BasicAuthBackend(AuthenticationBackend): async def authenticate(self, conn): if "Authorization" not in conn.headers: raise AuthenticationError('No Authorization header provided') auth = conn.headers["Authorization"] try: scheme, credentials = auth.split() if scheme.lower() != 'basic': raise AuthenticationError('Invalid authorization scheme') decoded = base64.b64decode(credentials).decode("ascii") except (ValueError, UnicodeDecodeError, binascii.Error) as exc: raise AuthenticationError('Invalid basic auth credentials') username, _, password = decoded.partition(":") # TODO: You'd want to verify the username and password here. return AuthCredentials(["authenticated"]), SimpleUser(username)