Пользовательский бэкэнд для 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, но не увидел ничего, что соответствовало бы моей проблеме. Какие-нибудь предложения по этому поводу?