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

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

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

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

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

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


person voisin    schedule 30.10.2012    source источник
comment
Вы можете попробовать автоматическую привязку, если адреса электронной почты обеих социальных сетей совпадают. Я ответил на аналогичный вопрос, который может оказаться вам полезным - stackoverflow.com/a/19443127/805427   -  person elssar    schedule 01.12.2013


Ответы (2)


Если ваш пользователь уже вошел в систему, я успешно подключил другую учетную запись с помощью тега 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. Для меня было бы достаточно автоматической привязки логинов и большого улучшения удобства использования.

person neves    schedule 14.10.2013

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

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

  • Найдите пользователя на своем сайте, выясните его адрес электронной почты (часто это очень просто)
  • Создайте учетную запись у одного из ваших провайдеров с моей электронной почтой
  • Подтвердите адрес электронной почты, добавьте его адрес электронной почты, удалите мой (только один из ваших провайдеров не сделает все возможное, чтобы эта дыра открылась)
  • 'Зарегистрируйтесь' на вашу услугу с моей новой учетной записью провайдера с низким тарифом
  • Автоматически подключитесь к исходному пользователю, получите доступ к его учетной записи

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

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

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

person Ted    schedule 15.12.2012
comment
Хорошо, это может быть проблема с безопасностью, но вы не отвечаете на вопрос. - person neves; 14.10.2013
comment
@neves Я возражаю против рассмотрения вопроса. Это ответ, но не тот, который вам нужен. «Не следует» - правильный ответ более чем в 99% случаев, когда возникает вопрос: «Как мне отрезать руку». - person Ted; 22.09.2014
comment
Не начинать здесь пламенную войну. Ваши опасения по поводу безопасности разумны, но безопасность - это компромисс. Если моя третья сторона - это просто Google и Facebook, а мой сайт не является банковским аккаунтом, возможно, я смогу обменять безопасность на лучшее удобство использования. - person neves; 25.09.2014
comment
Пожалуйста, прочтите вопрос, прежде чем писать везде один и тот же рейв, у пользователя уже есть учетная запись django, о каких проблемах безопасности вы говорите? - person Denis; 22.04.2017
comment
Это проблема безопасности, только если поставщик полностью ненадежен. Если поставщиком Oauth является Google или Microsoft, где только ваша учетная запись gmail (или приложений micrsoft) аутентифицируется ими, дыра в безопасности, о которой вы говорите, сильно преувеличена. Простота использования имеет смысл во многих случаях использования. - person Rohit; 19.05.2020