Перенос с django-social-auth

Будучи производной от django-social-auth, портирование с него на python-social-auth должно быть легкой задачей. Перенос на другие библиотеки обычно является мучением, я стараюсь сделать это как можно проще.

Установленные приложения

На django-social-auth было одно приложение для добавления в INSTALLED_APPS плюс настройка, определяющая, какой ORM будет использоваться (по умолчанию или MongoEngine). Теперь приложения разделены и нет необходимости в дополнительных настройках.

При использовании ORM по умолчанию:

INSTALLED_APPS = (
    ...
    'social_django',
    ...
)

А при использовании MongoEngine:

INSTALLED_APPS = (
    ...
    'social_django_mongoengine',
    ...
)

Имена таблиц моделей были определены так, чтобы быть совместимыми с теми, которые используются в django-social-auth, поэтому перенос данных не требуется.

URL-адреса

URL являются пространством имен, вы можете выбрать свое пространство имен, example app использует пространство имен social. Замените старый include на:

urlpatterns = patterns('',
    ...
    url('', include('social_django.urls', namespace='social'))
    ...
)

В шаблонах используйте URL с разделителем имен:

{% url 'social:begin' "google-oauth2" %}

URL-адрес отключения аккаунта будет следующим:

{% url 'social:disconnect_individual' provider, id %}

Настройки портирования

Все настройки python-social-auth имеют префикс SOCIAL_AUTH_, за некоторым исключением на фреймворке Django, AUTHENTICATION_BACKENDS остается неизменным по очевидным причинам.

All backends settings have the backend name included in the name, all uppercase and with dashes replaced with underscores. For example, the Google OAuth2 backend is named google-oauth2, so setting names related to that backend should start with SOCIAL_AUTH_GOOGLE_OAUTH2_.

Keys and secrets are some mandatory settings needed for OAuth providers; to keep consistency the names follow the same naming convention: *_KEY for the application key, and *_SECRET for the secret. OAuth1 backends used to have CONSUMER in the setting name but not anymore. Following with the Google OAuth2 example:

SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = '...'
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = '...'

Remember that the name of the backend is needed in the settings, and names differ a little from backend to backend; for instance the Facebook OAuth2 backend name is facebook. So the settings should be:

SOCIAL_AUTH_FACEBOOK_KEY = '...'
SOCIAL_AUTH_FACEBOOK_SECRET = '...'

Бэкенды аутентификации

Import path for authentication backends changed a little, there’s no more contrib module, there’s no need for it. Some backends changed the names to have some consistency. Check the backends, it should be easy to track the names changes. Examples of the new import paths:

AUTHENTICATION_BACKENDS = (
    'social_core.backends.open_id.OpenIdAuth',
    'social_core.backends.google.GoogleOpenId',
    'social_core.backends.google.GoogleOAuth2',
    'social_core.backends.google.GoogleOAuth',
    'social_core.backends.twitter.TwitterOAuth',
    'social_core.backends.facebook.FacebookOAuth2',
)

Сессия

Django stores the last authentication backend used in the user session as an import path; this can cause import troubles when porting since the old import paths aren’t valid anymore. Some solutions to this problem are:

  1. Очистите сессию и заставьте пользователей снова войти в систему на вашем сайте

  2. Запустите сценарий миграции, который обновит значение сессии бэкенда аутентификации для каждой сессии в вашей базе данных. Это подразумевает определение нового пути импорта для каждого настроенного бэкенда, который является значением, используемым в настройке AUTHENTICATION_BACKENDS.

    @tomgruner создал Gist здесь, который обновляет значение только для бэкенда Facebook. template для этого скрипта будет выглядеть следующим образом:

    from django.contrib.sessions.models import Session
    
    BACKENDS = {
        'social_auth.backends.facebook.FacebookBackend': 'social_core.backends.facebook.FacebookOAuth2'
    }
    
    for sess in Session.objects.iterator():
        session_dict = sess.get_decoded()
    
        if '_auth_user_backend' in session_dict.keys():
            # Change old backend import path from new backend import path
            if session_dict['_auth_user_backend'].startswith('social_auth'):
                session_dict['_auth_user_backend'] = BACKENDS[session_dict['_auth_user_backend']]
                new_sess = Session.objects.save(sess.session_key, session_dict, sess.expire_date)
                print 'New session saved {}'.format(new_sess.pk)
    
Вернуться на верх