'Django decides which `authenticate` to call by inspecting the
arguments. So it\'s better to create `authenticate` function
with well defined arguments.
Keeping this function separate so that it can easily be
overridden.'

def authenticate(self, realm_subdomain='', storage=None, strategy=None, user=None, return_data=None, response=None, backend=None):

    if (user is None):
        user = {}
    if (return_data is None):
        return_data = {}
    if (response is None):
        response = {}
    return self._common_authenticate(self, realm_subdomain=realm_subdomain, storage=storage, strategy=strategy, user=user, return_data=return_data, response=response, backend=backend)
