'Authenticate user and return an authentication context.
:param request: context of an authentication request
:type request: common.request.Request
:param auth_payload: the payload content of the authentication request
for a given method
:type auth_payload: dict
If successful, plugin must set ``user_id`` in ``response_data``.
``method_name`` is used to convey any additional authentication methods
in case authentication is for re-scoping. For example, if the
authentication is for re-scoping, plugin must append the previous
method names into ``method_names``; NOTE: This behavior is exclusive
to the re-scope type action. Also, plugin may add any additional
information into ``extras``. Anything in ``extras`` will be conveyed in
the token\'s ``extras`` attribute. Here\'s an example of
``response_data`` on successful authentication::
"extras": {},
"methods": [
"password",
"token"
"user_id": "abc123"
Plugins are invoked in the order in which they are specified in the
``methods`` attribute of the ``identity`` object. For example,
``custom-plugin`` is invoked before ``password``, which is invoked
before ``token`` in the following authentication request::
"auth": {
"identity": {
"custom-plugin": {
"custom-data": "sdfdfsfsfsdfsf"
"methods": [
"custom-plugin",
"password",
"token"
"password": {
"user": {
"id": "s23sfad1",
"password": "secret"
"token": {
"id": "sdfafasdfsfasfasdfds"
:returns: AuthHandlerResponse with status set to ``True`` if auth was
successful. If `status` is ``False`` and this is a multi-step
auth, the ``response_body`` can be in a form of a dict for
the next step in authentication.
:raises keystone.exception.Unauthorized: for authentication failure'

@abc.abstractmethod
def authenticate(self, request, auth_payload):

    raise exception.Unauthorized()
