Подтвердить что ты не робот

Django-allauth: привязка нескольких социальных учетных записей к одному пользователю

При тестировании django-allauth, если я вхожу в систему и выхожу из системы с разными социальными учетными записями, они, похоже, не связаны друг с другом (я не могу получить к ним доступ, посмотрев на socialaccount_set.all.0, socialaccount_set.all. 1 и т.д.).

Может кто-нибудь объяснить, как связать социальные счета вместе?

Я видел этот пост: как подключить несколько поставщиков социальных сетей к одному и тому же пользователю django с помощью django-allauth?, который, кажется, ставит бремя на пользователя сначала войти в систему с одним социальным аккаунтом, а затем связать другие учетные записи для себя.

Разумеется, должен быть способ сделать это, не налагая onus на пользователя? Может быть, по адресам электронной почты?

Есть ли способ сделать это после факта с существующими пользователями?

4b9b3361

Ответ 1

Если ваш пользователь уже зарегистрирован, я успешно подключил другую учетную запись, используя тег provider_login_url и установив атрибут process="connect". Вот фрагмент кода, который должен быть помещен в блок, отображаемый для аутентифицированных пользователей:

{% load socialaccount %}
<p><a href="{% provider_login_url "facebook" process="connect" %}">Connect a facebook account</a></p>
<p><a href="{% provider_login_url "google" process="connect" %}">Connect a Google account</a></p>

Установите SOCIALACCOUNT_QUERY_EMAIL=True и не забывайте запрашивать электронное письмо в рамках ваших поставщиков:

SOCIALACCOUNT_PROVIDERS = \
    {'facebook':
         {'SCOPE': ['email', ],
          'AUTH_PARAMS': {'auth_type': 'reauthenticate'},
          'METHOD': 'oauth2',
          'LOCALE_FUNC': lambda request: 'pt_BR'},
     'google':
         {'SCOPE': ['https://www.googleapis.com/auth/userinfo.profile',
                    'email'],
          'AUTH_PARAMS': {'access_type': 'online'}
         },
}

Я также хочу знать, можно ли автоматически связать учетную запись с помощью адреса электронной почты. Я могу видеть в столбце "extra_data" таблицы socialaccount_socialaccount, что и Google, и Facebook отправляют "verified_email": true. Для меня достаточно было бы автоматически связать логины и отличное улучшение удобства использования.

Ответ 2

Конечно, должен быть способ сделать это, не налагая onus на Пользователь? Может быть, по адресам электронной почты?

Будьте очень осторожны, как вы это делаете. Вы можете открыть огромную дыру в безопасности. Если вы не ставите какую-то оскорбление пользователя и просто устанавливаете учетные записи с тем же адресом электронной почты, вы вводите следующий вектор атаки:

  • Найдите пользователя на своем сайте, узнайте свой адрес электронной почты (часто это очень просто).
  • Создайте учетную запись у одного из ваших провайдеров с моей электронной почтой.
  • Подтвердите адрес электронной почты, добавьте их адрес электронной почты, удалите мои данные (только один из ваших провайдеров не будет делать полные угловые случаи для открытия этого отверстия).
  • "Регистрация" для вашей службы с моей новой учетной записью lax-provider
  • Получить автоматический доступ к внутреннему пользователю, получить доступ к их учетной записи

Вы можете предпринять шаги для снижения этого риска, но даже если всем провайдерам требуется подтверждение по электронной почте сейчас, любой промах в сторонних командах откроет это отверстие в вашей безопасности.

Возможно, за то, что вы делаете, риск заслуживает внимания, просто будьте осторожны. Немного беспокоиться о пользователе, вероятно, не самое худшее.

Я видел потоки, где он предлагает автосогласование, затем запрашивает у вас пароль или повторную аутентификацию с одним из исходных поставщиков, чтобы добавить новую учетную запись в свою исходную учетную запись. У них не было бы такого же потенциала для использования, но у них были бы некоторые угловые случаи мозга и fc cc и осложнения UI.