Социальная аутентификация Python: по умолчанию бэкэнд Django не аутентифицирует пользователей - PullRequest
0 голосов
/ 23 октября 2019

Я хочу добавить аутентификацию с разными провайдерами аутентификации в мой проект Django, поэтому я решил использовать python-social-auth. Я настроил мои settings.py, как упомянуто в официальном документах . И Django ModelBackend никогда не аутентифицирует пользователя!

settings.py:

AUTHENTICATION_BACKENDS = (
    'social_core.backends.backends.GithubOAuth2',
    'django.contrib.auth.backends.ModelBackend',
)

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [
            BASE_DIR.child('templates'),
        ],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
                'social_django.context_processors.backends',
                'social_django.context_processors.login_redirect',
            ],
        },
    },
]

SOCIAL_AUTH_USER_MODEL = 'users.CustomUser'
SOCIAL_AUTH_URL_NAMESPACE = 'social'

SOCIAL_AUTH_GITHUB_KEY = '...'
SOCIAL_AUTH_GITHUB_SECRET = '...'

# don`t want to create users

SOCIAL_AUTH_PIPELINE = (
    'social_core.pipeline.social_auth.social_details',
    'social_core.pipeline.social_auth.social_uid',
    'social_core.pipeline.social_auth.social_user',
    'social_core.pipeline.user.get_username',
    'social_core.pipeline.social_auth.associate_user',
    'social_core.pipeline.social_auth.load_extra_data',
    'social_core.pipeline.user.user_details',
)

urls.py:

urlpatterns = [
    ...
    path('social/', include('social_django.urls', namespace='social')),
    ...
]

шаблон: <a href="{% url "social:begin" "github" %}">Login with GitHub</a>

Это происходит потому, что social_core не вводит аргументы имени пользователя и пароля для метода authenticate, ModelBackend всегда не может получить пользователей. Переданные аргументы - это экземпляр сервера, экземпляр хранилища и ответ от GitHub. Итак, я решил создать свой собственный auth backend.

class SocialAuth(ModelBackend):
    def authenticate(self, request, **kwargs):
        backend = kwargs.get('backend')
        response = kwargs.get('response')
        username = backend.get_user_details(response)['username']
        return UserModel.objects.get_by_natural_key(username)

И он работает хорошо, тогда я получаю некоторые ошибки с атрибутом user.social_user, но я думаю, это слишком много для одного вопроса. Итак, почему все эти шаги не упомянуты в документации, или я допускаю некоторые ошибки в моих конфигурациях?

версии: python-3.6.8, django-2.2.6, social-auth-app-django-3.1.0, social-auth-core-3.2.0.

...