Пользователи не создаются после входа в систему через facebook (вероятно, случай омонимии)

Я пытаюсь научиться интегрировать социальную аутентификацию python в проект django.

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

вот моя конфа

INSTALLED_APPS = (
    ...
    'social.apps.django_app.default',
    'messaging'
)

AUTHENTICATION_BACKENDS = (
    'social.backends.facebook.FacebookOAuth2',
    'social.backends.email.EmailAuth',
    'django.contrib.auth.backends.ModelBackend',
)

SOCIAL_AUTH_FACEBOOK_KEY='XX'
SOCIAL_AUTH_FACEBOOK_SECRET='YYY'
FACEBOOK_EXTENDED_PERMISSIONS = ['email']
SOCIAL_AUTH_FACEBOOK_SCOPE = ['email']

LOGIN_URL = '/login/'
LOGIN_REDIRECT_URL = '/home/'
LOGOUT_REDIRECT_URL = '/'
URL_PATH = ''
SOCIAL_AUTH_STRATEGY = 'social.strategies.django_strategy.DjangoStrategy'
SOCIAL_AUTH_STORAGE = 'social.apps.django_app.default.models.DjangoStorage'

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth',
    'social.apps.django_app.context_processors.backends',
    'social.apps.django_app.context_processors.login_redirect',
)

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

У вас есть идеи, почему пользователи не создаются при входе в систему?

ОБНОВЛЕНИЕ

Я заметил нечто странное, по крайней мере, для меня. Первый пользователь-администратор, который создается при выполнении syncdb, имеет то же имя и фамилию, что и учетная запись facebook, которую я использую для тестирования приложения. Я думал, что он не будет использоваться и что нужно создать другого пользователя, но при проверке базы данных я увидел, что auth_user.last_login был обновлен в соответствии с входом в систему, выполненным через facebook.

Итак, у меня есть два вопроса:

  1. правильно ли, что социальная аутентификация python проверяет, присутствует ли пользователь с тем же именем и фамилией в auth_user, а затем использует этого конкретного пользователя вместо создания другого?
  2. как я могу избежать ситуации, когда пользователь Foo Bar в Facebook и пользователь Foo Bar в Twitter не являются одним и тем же лицом?

person Ottavio Campana    schedule 03.05.2014    source источник


Ответы (1)


Быстрые ответы на ваши вопросы:

  1. No
  2. Для этого ничего не нужно.

Мне кажется, что вы вошли в систему с этим пользователем-администратором, прежде чем щелкнуть ссылку Login with Facebook. python-social-auth возьмет текущего вошедшего в систему пользователя и свяжет с ним социальную учетную запись (если есть какой-либо пользователь, вошедший в систему), в противном случае он создаст новую учетную запись. Но, если учетная запись социальной сети уже использовалась на вашем сайте, она войдет в систему соответствующего пользователя или удалит исключение, указывающее, что учетная запись социальной сети уже используется.

Вы можете проверить связанного пользователя с социальной учетной записью следующим образом:

from social.apps.django_app.default.models import UserSocialAuth

for social in UserSocialAuth.objects.all():
  print social.provider, social.user.id, social.user.username

Вот что я бы сделал в вашем случае:

  1. Выбросить базу данных или удалить содержимое таблицы social_auth_usersocialauth
  2. Перейдите на /admin и убедитесь, что вы вышли из системы.
  3. Попробуйте снова войти через Facebook

На этот раз необходимо создать новую учетную запись пользователя.

person omab    schedule 03.05.2014