Пользовательский бэкэнд для Python Social Auth сталкивается с ошибкой "issubclass() arg 1 must be a class".

Я пытаюсь создать пользовательский бэкэнд (Ping Identity) в Python Social Auth для проекта Django, следуя этим указаниям: https://python-social-auth.readthedocs.io/en/latest/backends/implementation.html. Я пробовал использовать свой собственный бэкенд для Ping Identity и пример GitHubOAuth2, который можно найти в документации, но я продолжаю получать ошибку, говорящую "issubclass() arg 1 must be a class".

Когда я просматриваю код, кажется, что PSA считает, что мой пользовательский класс не является подклассом BaseAuth. Эта проверка находится в social_core/backends/utils в строке 35:

if issubclass(backend, BaseAuth):
    BACKENDSCACHE[backend.name] = backend

Мой код Ping Identity выглядит практически так же, как и пример в документации, поэтому давайте посмотрим на этот код:

from social_core.backends.oauth import BaseOAuth2

class GitHubOAuth2(BaseOAuth2):
    """GitHub OAuth authentication backend"""
    name = 'github'
    AUTHORIZATION_URL = 'https://github.com/login/oauth/authorize'
    ACCESS_TOKEN_URL = 'https://github.com/login/oauth/access_token'
    ACCESS_TOKEN_METHOD = 'POST'
    SCOPE_SEPARATOR = ','
    EXTRA_DATA = [
        ('id', 'id'),
        ('expires', 'expires')
    ]

    def get_user_details(self, response):
        """Return user details from GitHub account"""
        return {'username': response.get('login'),
                'email': response.get('email') or '',
                'first_name': response.get('name')}

    def user_data(self, access_token, *args, **kwargs):
        """Loads user data from service"""
        url = 'https://api.github.com/user?' + urlencode({
            'access_token': access_token
        })
        return self.get_json(url)

Класс использует BaseOAuth2 -> OAuthAuth -> BaseAuth, поэтому я не уверен, почему PSA жалуется. Мой settings.py (имя_проекта.имя_проекта.settings) выглядит так:

...
AUTHENTICATION_BACKENDS = (
    'api.PingIdentityOAuth2',
    'api.GitHubOAuth2',
    'django.contrib.auth.backends.ModelBackend',
)
...

Файл примера GitHubOAuth2 - project_name.api.GitHubOAuth2. Я проверяю это, просто выполняя GET-запрос к localhost:8000/login/github или localhost:8000/login/pingidentity.

Я отладил код и могу подтвердить, что он, похоже, захватывает правильный класс, когда делает issubclass(backend, BaseAuth):. Чтобы убедиться в этом, я выполнил импорт пользовательского класса в моем View, чтобы проверить, не является ли это проблемой пути, и, похоже, все в порядке. Я также проверил некоторые проблемы на Github и stackoverflow, но не увидел ничего, что соответствовало бы моей проблеме. Какие-нибудь предложения по этому поводу?

Вернуться на верх