Как показать пользователю форму для установки имени пользователя при использовании django с django-social-auth - PullRequest
0 голосов
/ 16 июля 2011

Я использую django-social-auth (https://github.com/omab/django-social-auth), с некоторым успехом - вход в систему через Twitter и Facebook был настроен без затруднений. Однако, когда я вхожу в систему от некоторых поставщиков OpenID, я сталкиваюсь спустая переменная для имени пользователя, и приложение social-auth позволяет это (несмотря на то, что я установил SOCIAL_AUTH_DEFAULT_USERNAME).

Хотя SOCIAL_AUTH_DEFAULT_USERNAME работает правильно, что может быть временным решением, в идеале я бы предпочел, чтобы оно было либо установленоавтоматически от поставщика openID. По сути, у меня остается два возможных решения:

1) Создайте пользовательский метод для извлечения некоторых дополнительных данных, отправленных поставщиком openID, для установки имени пользователя из этого.2) Заставьте пользователя устанавливать имя пользователя при первом входе в систему.

Хотя (2) менее элегантно, это гарантирует, что имя пользователя вставляется каждый раз, а также устраняет необходимость некоторой пост-обработкиавтоматическая информация, которая может быть не в подходящем формате для имени пользователя.

Мой вопрос сводится к тому, как я могу реализовать что-либо из перечисленного!Полные ответы не обязательны, но указатели на метод были бы весьма полезны!

Альтернатива - поиграть с django-socialregistration и посмотреть, облегчает ли это жизнь!

J

1 Ответ

2 голосов
/ 17 июля 2011

1, вероятно, путь. Вы можете переопределить метод get_user_details класса Backend для социальных провайдеров, с которыми у вас возникли проблемы, и извлечь имя пользователя оттуда.

Это будет выглядеть примерно так, например, для Facebook:

from social_auth.backends.facebook import FacebookBackend
class CustomFacebookBackend(FacebookBackend):
    name = 'facebook'

    def get_user_details(self, response):
        """Return user details from Facebook account"""
        return {'username': response['name'],
                'email': response.get('email', ''),
                'first_name': response.get('first_name', ''),
                'last_name': response.get('last_name', '')}

Переменная «response» - это десериализованные данные, возвращаемые из запроса поставщику OAuth для получения сведений о пользователе, поэтому вы можете извлечь из этого все, что вам нужно, или ввести свои собственные значения здесь. social-auth примет все, что вы введете в «username», и будет использовать это в качестве имени пользователя для новой учетной записи. Если вам нужен больший контроль, попробуйте переопределить метод «username» бэкэнда.

При переопределении бэкэнда не забудьте добавить его в AUTHENTICATION_BACKENDS в settings.py. Кроме того, я не уверен, как именно это работает, но я думаю, что вам нужно добавить что-то подобное в файл с вашим пользовательским бэкэндом, чтобы social-auth правильно связал ваш бэкэнд:

BACKENDS = {
    'facebook': CustomFacebookAuth,
}
...