Перенос с 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:
Очистите сессию и заставьте пользователей снова войти в систему на вашем сайте
Запустите сценарий миграции, который обновит значение сессии бэкенда аутентификации для каждой сессии в вашей базе данных. Это подразумевает определение нового пути импорта для каждого настроенного бэкенда, который является значением, используемым в настройке 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)