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

Я пытаюсь войти в систему через facebook. Для этого я использовал django-social-auth. Я успешно интегрировал его в свой тестовый проект. Однако я не знаю, как сопоставить пользователя с пользователем django auth. Чтобы быть более точным, скажем, например, что я аутентифицирую пользователя через facebook. После завершения сеанса пользователь выходит из системы. Когда пользователь возвращается во второй раз, опять же через facebook, как я узнаю, что это тот же пользователь? Я не могу использовать имя пользователя facebook, потому что имя пользователя можно изменить! Я не могу использовать идентификатор электронной почты пользователя по понятным причинам. Какой идентификатор из данных, отправленных facebook, считать уникальным для конкретного пользователя? Ключи из ответа, отправленного facebook, следующие:

['username', 'bio', 'first_name', 'last_name', 'verified', 'name', 'locale', 'hometown', 'work', 'expires', 'sports', 'languages', 'quotes', 'link', 'location', 'gender', 'access_token', 'timezone', 'education', 'updated_time', 'id']

Тем не менее, наиболее очевидным для меня ответом является использование «id» для идентификации пользователя, каковы шансы, что facebook переместит все свои данные на новые серверы, а поле «id», связанное с пользователями, изменится? Если это произойдет, это может привести к тому, что пользователь с измененным идентификатором получит доступ к данным другого пользователя, если он получит тот же идентификатор, что и предыдущий идентификатор последнего! Вероятно, я могу использовать комбинацию «id» и «имя пользователя», поскольку facebook позволяет вам изменить имя пользователя только один раз. Но если они снимут это ограничение, это нарушит мою логику. Я совершенно новичок в OAuth2, поэтому, пожалуйста, простите мое невежество, если это звучит глупо. Я пытался немного исследовать, но потерялся в огромных учебниках! Как люди обычно справляются с этим?

РЕДАКТИРОВАТЬ: ответы на вопрос, связанный как дубликат, не отвечают на мой вопрос о том, как бороться с изменением идентификатора на стороне facebook. Хотя это редкий случай, такую ​​возможность нельзя исключать, особенно потому, что изменение произойдет на стороне Facebook, и я не могу это контролировать. Более того, у меня даже не было бы намека, когда он изменится. И если такое произойдет, безопасность пользователей моего приложения будет под угрозой! Поскольку OAuth2 является своего рода стандартом, есть ли какие-либо рекомендации по уникальному идентификатору? Есть ли какие-либо правила, запрещающие провайдеру изменять идентификатор пользователя?


person Atmaram Shetye    schedule 24.06.2013    source источник


Ответы (1)


Плагин Django socialauth делает все это. Если я правильно помню (использовав это в одном проекте 3 года назад), у socialauth есть собственная модель для привязки пользователей к учетным записям в других средах, таких как facebook.

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

Посмотрите на этот файл: https://github.com/omab/django-social-auth/blob/master/social_auth/db/django_models.py

Есть модели для сохранения этих ссылок.

Алан

person Odif Yltsaeb    schedule 24.06.2013
comment
Просматривая исходный код django-social-auth, кажется, что он использует uid, предоставленный facebook, для связывания учетных записей. Привязка адресов электронной почты по умолчанию отключена из-за возможных опасных последствий для сайтов, где важна конфиденциальность пользователей. Мой вопрос в основном о том, чтобы сделать ассоциацию еще более безопасной и надежной. ID — это поле, предоставленное facebook. Это означает, что при использовании для связывания учетных записей в моем приложении это может нарушить безопасность и надежность ассоциации всякий раз, когда facebook меняет идентификаторы! - person Atmaram Shetye; 24.06.2013
comment
Мне нужны некоторые поля, которые уникальны для пользователя, но не зависят от третьих лиц, таких как facebook. Я мог бы просить о невозможном, но отсутствие такого поля затрудняет надежность ассоциации аккаунта! - person Atmaram Shetye; 24.06.2013