2013-04-14 8 views
4

Я использую django social-auth (http://django-social-auth.readthedocs.org/en/latest/index.html) и пытается создать профиль пользователя, в котором пользователь может связывать несколько учетных записей (например, здесь, в Stackoverflow).Объединение нескольких учетных записей django social-auth

В настоящее время я нахожусь в точке, где один пользователь может войти в систему с использованием разных поставщиков аутентификации, но для каждого входа создается новый пользователь. Как я могу связать все учетные записи пользователей с одним (например, с профилем пользователя)?

Кроме того, что лучше всего подходит для создания страницы профиля пользователя при использовании django social-auth?

ответ

8

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

Что касается вашего профиля, рекомендуемый способ добавления функциональности АСС является расширение pipeline, вы можете создать такую ​​запись:

def create_profile(user, is_new=False, *args, **kwargs): 
    if is_new: 
     # create a profile instance for the given user 
     create_user_profile(user) 

Затем зарегистрировать его в настройках, как это:

SOCIAL_AUTH_PIPELINE = (
    'social_auth.backends.pipeline.social.social_auth_user', 
    'social_auth.backends.pipeline.user.get_username', 
    'social_auth.backends.pipeline.user.create_user', 
    'social_auth.backends.pipeline.social.associate_user', 
    'social_auth.backends.pipeline.social.load_extra_data', 
    'social_auth.backends.pipeline.user.update_user_details', 
    'myapp.pipeline.create_profile' 
) 

Если запись является способом импорта, чтобы получить эту функцию.

Редактировать: ссылка на документы и описание настроек.

+0

Но зачем добавлять это к конвейеру вместо использования обратного вызова post_save? Последний должен работать независимо от того, какой сервер аутентификации создал пользователь. – knipknap

1

Я вижу 2 alterntive, когда вы хотите, чтобы справиться с несколькими ассоциации счета:

    1. Найти уникальный атрибут, который все провайдер идентификации имеет.
    1. Храните базовую аутентификацию и связывайте с ней всех остальных поставщиков удостоверений.

Первый подход имеет 2 недостатки

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

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

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

Храните также в курсе дел о сборке данных. Укажите, какой поставщик будет иметь предпочтение при настройке данных для вашей локальной учетной записи, чтобы не превращать ваши данные в неправильные или истекшие сроки. (Прочитано somethig о "Level of assurance)

Это старый спор, так прежде реализовать что-то, начинает читать. Есть много интересной документации об этом issues

Связанных с конкретной проблемой в Джанго. Прочитайте эту Comparation между дифферентом djago social-auth apps. Также проверьте django-socialprofile и это old thread

+2

django-social-auth уже поддерживает множественную ассоциацию учетных записей и использует идентификатор, предоставленный поставщиком auth, и имя поставщика (уникальное приложение). – omab

+0

ох, извините, omab, вы правы. Слишком долго, не следя за этим. – smartin

Смежные вопросы