2016-07-25 3 views
1

나는 직접 등록을 위해 python-social-auth을 사용하는 장고 프로젝트를 만들었습니다. 등록 양식을 통해 계정을 만들 때 이미 사용했던 이메일 ID를 사용하는 social_auth로 로그인하려고하면 기존 행을 사용하는 대신 별도의 행이 삽입됩니다.Django 소셜 인증을 사용자 등록으로 동기화

이메일 ID를 모델에서 고유 한 것으로 변경 한 후 social_auth를 통해 로그인하려고하면 "이메일 ID가 이미 존재합니다"라는 오류 메시지가 나타납니다. 전자 메일에서 고유 항목을 제거하면 사용자 테이블에 들어오는 항목이 분리되어 다른 계정으로 간주됩니다.

이제는 문제가 있습니다. (등록 양식, Facebook, Google을 사용하여 생성) 동일한 이메일에 대해 개의 별도 계정을 필요로하지 않습니다. 은 등록 양식과 소셜 인증을 사용하여 생성 된 계정을 동기화해야합니다 ().

Settings.py

import os 
import datetime 
BASE_DIR = os.path.dirname(os.path.dirname(__file__)) 
PROJECT_ROOT = os.path.abspath(os.path.dirname(BASE_DIR)) 

SECRET_KEY = '**********' 

DEBUG = True 

TEMPLATE_DEBUG = True 

ALLOWED_HOSTS = ['*'] 

INSTALLED_APPS = (
    'django.contrib.admin', 
    'django.contrib.auth', 
    'django.contrib.contenttypes', 
    'django.contrib.sessions', 
    'django.contrib.messages', 
    'django.contrib.staticfiles', 
    'rest_framework', 
    'app.accounts', 
    'social.apps.django_app.default', 
) 

MIDDLEWARE_CLASSES = (
    'django.contrib.sessions.middleware.SessionMiddleware', 
    'django.middleware.common.CommonMiddleware', 
    'django.middleware.csrf.CsrfViewMiddleware', 
    'django.contrib.auth.middleware.AuthenticationMiddleware', 
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware', 
    'django.contrib.messages.middleware.MessageMiddleware', 
    'django.middleware.clickjacking.XFrameOptionsMiddleware', 
    'social.apps.django_app.middleware.SocialAuthExceptionMiddleware', 
) 

AUTHENTICATION_BACKENDS = (
    'social.backends.facebook.FacebookOAuth2', 
    'social.backends.google.GoogleOAuth2', 
    'app.accounts.backends.AuthBackend', 
    'django.contrib.auth.backends.ModelBackend', 
) 
REST_FRAMEWORK = { 
    'TEST_REQUEST_DEFAULT_FORMAT': 'json', 
    'DEFAULT_RENDERER_CLASSES': (
     'rest_framework.renderers.JSONRenderer', 
    ), 
    'DEFAULT_PERMISSION_CLASSES': (
     'rest_framework.permissions.IsAuthenticated', 
     'rest_framework.permissions.AllowAny', 
    ), 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework_jwt.authentication.JSONWebTokenAuthentication', 
     'rest_framework.authentication.SessionAuthentication', 
     'rest_framework.authentication.BasicAuthentication', 
    ) 
} 

JWT_AUTH = { 
    'JWT_EXPIRATION_DELTA': datetime.timedelta(days=14) 
} 
JWT_ALLOW_REFRESH = True 

TEMPLATE_CONTEXT_PROCESSORS = (
    'django.contrib.auth.context_processors.auth', 
    'django.core.context_processors.debug', 
    'django.core.context_processors.i18n', 
    'django.core.context_processors.media', 
    'django.core.context_processors.static', 
    'django.core.context_processors.tz', 
    'django.core.context_processors.request', 
    'django.core.context_processors.csrf', 
    'django.contrib.messages.context_processors.messages', 
    'social.apps.django_app.context_processors.backends', 
    'social.apps.django_app.context_processors.login_redirect', 
) 


AUTH_USER_MODEL = 'accounts.Account' 

ROOT_URLCONF = 'main.urls' 

WSGI_APPLICATION = 'main.wsgi.application' 


DATABASES = { 
    'default': { 
     'ENGINE': 'django.db.backends.mysql', 
     'NAME': 'db', 
     'USER': 'root', 
     'PASSWORD': 'root', 
     'HOST': 'localhost', 
     'PORT': '3306', 
    } 
} 

LANGUAGE_CODE = 'en-us' 

TIME_ZONE = 'UTC' 

USE_I18N = True 

USE_L10N = True 

USE_TZ = True 

STATIC_URL = '/static/' 

STATIC_ROOT = os.path.join(PROJECT_ROOT, 'static') 

TEMPLATE_DIRS = (
    os.path.join(PROJECT_ROOT, 'templates'), 
) 

STATICFILES_DIRS = (
    os.path.join(PROJECT_ROOT, 'static'), 
) 

SOCIAL_AUTH_LOGIN_URL = 'accounts/home/' 
SOCIAL_AUTH_LOGIN_REDIRECT_URL = 'accounts/home/' 


SOCIAL_AUTH_PIPELINE = (
    'social.pipeline.social_auth.social_details', 
    'social.pipeline.social_auth.social_uid', 
    'social.pipeline.social_auth.auth_allowed', 
    'social.pipeline.social_auth.social_user', 
    'social.pipeline.user.get_username', 
    'social.pipeline.mail.mail_validation', 
    'social.pipeline.user.create_user', 
    'social.pipeline.social_auth.load_extra_data', 
    ) 

SOCIAL_AUTH_USER_MODEL='accounts.Account' 

역 추적

Traceback (most recent call last): 
    File "/home/mugesh/.local/lib/python2.7/site-packages/django/core/handlers/base.py", line 149, in get_response 
    response = self.process_exception_by_middleware(e, request) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/django/core/handlers/base.py", line 147, in get_response 
    response = wrapped_callback(request, *callback_args, **callback_kwargs) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/django/views/decorators/cache.py", line 57, in _wrapped_view_func 
    response = view_func(request, *args, **kwargs) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/django/views/decorators/csrf.py", line 58, in wrapped_view 
    return view_func(*args, **kwargs) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/social/apps/django_app/utils.py", line 51, in wrapper 
    return func(request, backend, *args, **kwargs) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/social/apps/django_app/views.py", line 28, in complete 
    redirect_name=REDIRECT_FIELD_NAME, *args, **kwargs) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/social/actions.py", line 43, in do_complete 
    user = backend.complete(user=user, *args, **kwargs) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/social/backends/base.py", line 41, in complete 
    return self.auth_complete(*args, **kwargs) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/social/utils.py", line 229, in wrapper 
    return func(*args, **kwargs) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/social/backends/oauth.py", line 387, in auth_complete 
    *args, **kwargs) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/social/utils.py", line 229, in wrapper 
    return func(*args, **kwargs) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/social/backends/oauth.py", line 396, in do_auth 
    return self.strategy.authenticate(*args, **kwargs) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/social/strategies/django_strategy.py", line 96, in authenticate 
    return authenticate(*args, **kwargs) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/django/contrib/auth/__init__.py", line 74, in authenticate 
    user = backend.authenticate(**credentials) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/social/backends/base.py", line 82, in authenticate 
    return self.pipeline(pipeline, *args, **kwargs) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/social/backends/base.py", line 85, in pipeline 
    out = self.run_pipeline(pipeline, pipeline_index, *args, **kwargs) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/social/backends/base.py", line 112, in run_pipeline 
    result = func(*args, **out) or {} 
    File "/home/mugesh/.local/lib/python2.7/site-packages/social/pipeline/user.py", line 70, in create_user 
    'user': strategy.create_user(**fields) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/social/strategies/base.py", line 53, in create_user 
    return self.storage.user.create_user(*args, **kwargs) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/social/storage/django_orm.py", line 60, in create_user 
    return cls.user_model().objects.create_user(*args, **kwargs) 
    File "/media/mugesh/Extra/STUDIES/Internship/Projects/wedifly/app/accounts/models.py", line 43, in create_user 
    return self._create_user(email, first_name, last_name, password, False, False, **extra_fields) 
    File "/media/mugesh/Extra/STUDIES/Internship/Projects/wedifly/app/accounts/models.py", line 26, in _create_user 
    user.save(using=self._db) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/django/contrib/auth/base_user.py", line 74, in save 
    super(AbstractBaseUser, self).save(*args, **kwargs) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/django/db/models/base.py", line 700, in save 
    force_update=force_update, update_fields=update_fields) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/django/db/models/base.py", line 728, in save_base 
    updated = self._save_table(raw, cls, force_insert, force_update, using, update_fields) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/django/db/models/base.py", line 812, in _save_table 
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/django/db/models/base.py", line 851, in _do_insert 
    using=using, raw=raw) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/django/db/models/manager.py", line 122, in manager_method 
    return getattr(self.get_queryset(), name)(*args, **kwargs) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/django/db/models/query.py", line 1039, in _insert 
    return query.get_compiler(using=using).execute_sql(return_id) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/django/db/models/sql/compiler.py", line 1060, in execute_sql 
    cursor.execute(sql, params) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/django/db/backends/utils.py", line 79, in execute 
    return super(CursorDebugWrapper, self).execute(sql, params) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/django/db/utils.py", line 95, in __exit__ 
    six.reraise(dj_exc_type, dj_exc_value, traceback) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/django/db/backends/utils.py", line 64, in execute 
    return self.cursor.execute(sql, params) 
    File "/home/mugesh/.local/lib/python2.7/site-packages/django/db/backends/sqlite3/base.py", line 323, in execute 
    return Database.Cursor.execute(self, query, params) 
IntegrityError: UNIQUE constraint failed: accounts.email 

제안이나 솔루션을 환영합니다. 완전히 새로운 사용자를 생성 반대로

SOCIAL_AUTH_PIPELINE = (
    ... 
    'social.pipeline.social_auth.associate_by_email', 
    'social.pipeline.user.create_user', 
    'social.pipeline.social_auth.associate_user', # <------ 
    'social.pipeline.social_auth.load_extra_data', 
    ... 
) 

그것은 양식 등록을 통해 생성 된 기존 사용자와 social_user를 연결해야합니다 내가이 문제를 해결하도록 설계되었습니다 associate_userSOCIAL_AUTH_PIPELINE에 추가 생각

+0

'AUTH_USER_MODEL'설정은 무엇입니까? –

+0

커스텀 사용자 모델을 지정했습니다. AUTH_USER_MODEL = 'accounts.Account'처럼 – Mugesh

+0

소셜 인증 앱의 설정을 표시 할 수 있습니까? –

답변

0

, 감사 .

+0

이메일 ID는 어떻게됩니까? 고유로 지정해야합니까? – Mugesh

+0

전자 메일 ID는 고유해야합니다. 이전 동작이 지속되지 않도록 데이터베이스를 다시 만들어야 할 수도 있습니다. –

+0

데이터베이스를 다시 만들고 등록 양식을 통해 새 사용자를 만든 다음 동일한 전자 메일 ID로 social_auth 계정으로 로그인하려고했습니다. 다음과 같은 오류가 발생합니다. "IntegrityError at/accounts/complete/google-oauth2/ UNIQUE 제약 조건 : accounts.email" – Mugesh

0

소셜 인증을 사용할 때 별도의 'social_auth_usersocialauth'테이블이 있습니다. 처음으로 로그인 할 때 채워지며 social auth는 'social_auth_usersocialauth'에 항목이없는 방식으로 작동합니다. 새로운 항목을 생성하고 사용자가 처음 로그인하여 새로운 사용자를 생성한다고 가정하므로 사용자가 다시 생성됩니다.

소셜 인증을 먼저 사용하고 등록 페이지로 이동하면 처음으로 등록하는지 확인하십시오. 그렇지 않으면 비정상적인 로그인으로 작동합니다.

+0

예, 할 수 있습니다. 그러나 먼저 등록 양식에 등록한 다음 사회 인증을 사용하여 로그인하면 어떻게됩니까? 이 경우 Social_auth는 항상 사용자 테이블에 새 행을 만들려고 시도하고 사회 인증을 사용하여 로그인 할 때 아래 오류가 발생합니다. "social_auth_usersocialauth가 사용자 등록에 채워지지 않아 Social auth perspective 사용자가 아직 작성되지 않았으므로/accounts/complete/google-oauth2/ UNIQUE 제약 조건 : accounts.email" – Mugesh

+0

@Mugesh를 사용하십시오. 'social_auth_usersocialauth'가 비어있는 것을 발견하면 새로운 사용자를 만들지 만 등록에 따라 여전히 무결성 오류가 발생합니다. 그래서 사회 인증을 누른 다음 등록하십시오. – doubleo46

+0

그러나 사용자 입장에서는 소셜 인증 로그인을 사용하기 전에 먼저 등록 양식을 사용하여 등록 할 수 있습니다. 이 경우 동일한 + 결성 오 y가 _ 생합니다. 그래서, 어떻게 해결할 ??? – Mugesh