def METHOD_NAME(self, request, code=None, **kwargs):
    log_prompt = "Process authenticate [OAuth2Backend]: {}"
    logger.debug(log_prompt.format('Start'))
    if code is None:
        logger.error(log_prompt.format('code is missing'))
        return None
    query_dict = {
        'client_id': settings.AUTH_OAUTH2_CLIENT_ID,
        'client_secret': settings.AUTH_OAUTH2_CLIENT_SECRET,
        'grant_type': 'authorization_code',
        'code': code,
        'redirect_uri': build_absolute_uri(
            request, path=reverse(settings.AUTH_OAUTH2_AUTH_LOGIN_CALLBACK_URL_NAME)
        )
    }
    if '?' in settings.AUTH_OAUTH2_ACCESS_TOKEN_ENDPOINT:
        separator = '&'
    else:
        separator = '?'
    access_token_url = '{url}{separator}{query}'.format(
        url=settings.AUTH_OAUTH2_ACCESS_TOKEN_ENDPOINT, separator=separator, query=urlencode(query_dict)
    )
    token_method = settings.AUTH_OAUTH2_ACCESS_TOKEN_METHOD.lower()
    requests_func = getattr(requests, token_method, requests.get)
    logger.debug(log_prompt.format('Call the access token endpoint[method: %s]' % token_method))
    headers = {
        'Accept': 'application/json'
    }
    if token_method == 'post':
        access_token_response = requests_func(access_token_url, headers=headers, json=query_dict)
    else:
        access_token_response = requests_func(access_token_url, headers=headers)
    try:
        access_token_response.raise_for_status()
        access_token_response_data = access_token_response.json()
        response_data = self.get_response_data(access_token_response_data)
    except Exception as e:
        error = "Json access token response error, access token response " \
                "content is: {}, error is: {}".format(access_token_response.content, str(e))
        logger.error(log_prompt.format(error))
        return None
    query_dict = self.get_query_dict(response_data, query_dict)
    headers = {
        'Accept': 'application/json',
        'Authorization': 'Bearer {}'.format(response_data.get('access_token', ''))
    }
    logger.debug(log_prompt.format('Get userinfo endpoint'))
    if '?' in settings.AUTH_OAUTH2_PROVIDER_USERINFO_ENDPOINT:
        separator = '&'
    else:
        separator = '?'
    userinfo_url = '{url}{separator}{query}'.format(
        url=settings.AUTH_OAUTH2_PROVIDER_USERINFO_ENDPOINT, separator=separator,
        query=urlencode(query_dict)
    )
    userinfo_response = requests.get(userinfo_url, headers=headers)
    try:
        userinfo_response.raise_for_status()
        userinfo_response_data = userinfo_response.json()
        if 'data' in userinfo_response_data:
            userinfo = userinfo_response_data['data']
        else:
            userinfo = userinfo_response_data
    except Exception as e:
        error = "Json userinfo response error, userinfo response " \
                "content is: {}, error is: {}".format(userinfo_response.content, str(e))
        logger.error(log_prompt.format(error))
        return None
    try:
        logger.debug(log_prompt.format('Update or create oauth2 user'))
        user, created = self.get_or_create_user_from_userinfo(request, userinfo)
    except JMSException:
        return None
    if self.user_can_authenticate(user):
        logger.debug(log_prompt.format('OAuth2 user login success'))
        logger.debug(log_prompt.format('Send signal => oauth2 user login success'))
        user_auth_success.send(
            sender=self.__class__, request=request, user=user,
            backend=settings.AUTH_BACKEND_OAUTH2
        )
        return user
    else:
        logger.debug(log_prompt.format('OAuth2 user login failed'))
        logger.debug(log_prompt.format('Send signal => oauth2 user login failed'))
        user_auth_failed.send(
            sender=self.__class__, request=request, username=user.username,
            reason=_('User invalid, disabled or expired'),
            backend=settings.AUTH_BACKEND_OAUTH2
        )
        return None