前提・実現したいこと
現在、転職用のポートフォリオとして会員登録制のwebアプリケーションを作成しております。
そこで、Eメールを主としたサインアップだけでは無くツイッターのアカウントを使用して手軽にログイン出来る様にしたいです。
サイトの仕様として、Eメールアドレスとパスワードでの会員登録を行っておりEメールアドレスは必須となっております。
質問
social-auth-app-djangoを使用してログインする時だけ、
必須であるEメールアドレスをパスしてデフォルトと同様の会員登録する方法をお教え頂きたいです。
または上記を実現するために、別の方法があれば
お教え頂きたいです。候補としてはdjango-allauthがあります。
発生している問題
会員登録にEメールアドレスが必須なのですが、Twitter apiから渡されるのはトークンとユーザーネームのため会員登録が出来ません。
下記のエラーメッセージは通常と異なる数値が渡されている事で起きているようです。
一応apiの認証画面までは行きますが、ログイン情報を入力してサインアップしようとするとエラーとなります。
ただ、グーグルアカウンでの認証は可能となっており、Twitterならびにgithubなどのアカウントでの会員登録、ログインが出来ません。
ValueError at /oauth/complete/twitter/ The given email must be set
該当のソースコード
settings.py
あるべきコードは省略しております。
django
1INSTALLED_APPS = [ 2 'register', #アプリ 3 'social_django', 4] 5 6 7MIDDLEWARE = [ 8 'social_django.middleware.SocialAuthExceptionMiddleware', 9] 10 11TEMPLATES = [ 12 { 13 'BACKEND': 'django.template.backends.django.DjangoTemplates', 14 'DIRS': [], 15 'APP_DIRS': True, 16 'OPTIONS': { 17 'context_processors': [ 18 'social_django.context_processors.backends', 19 'social_django.context_processors.login_redirect', 20 ], 21 }, 22 }, 23] 24 25AUTH_USER_MODEL = 'register.User' 26SOCIAL_AUTH_LOGIN_REDIRECT_URL = 'register:top' #リダイレクトURL 27 28AUTHENTICATION_BACKENDS = ( 29 'social_core.backends.open_id.OpenIdAuth', # for Google authentication 30 'social_core.backends.google.GoogleOpenId', # for Google authentication 31 'social_core.backends.google.GoogleOAuth2', # for Google authentication 32 'social_core.backends.twitter.TwitterOAuth', #for Twitter 33 'social_core.backends.github.GithubOAuth2', 34 'django.contrib.auth.backends.ModelBackend', 35) 36 37SOCIAL_AUTH_TWITTER_KEY = '取得済み' 38SOCIAL_AUTH_TWITTER_SECRET = '取得済み'
アプリ直下/urls.py
django
1urlpatterns = [ 2 path('oauth/', include('social_django.urls', namespace='social')), 3]
models.py
django
1class UserManager(BaseUserManager): 2 """ユーザーマネージャー.""" 3 4 use_in_migrations = True 5 6 def _create_user(self, email, password, **extra_fields): 7 """メールアドレスでの登録を必須にする""" 8 if not email: 9 raise ValueError('The given email must be set') 10 email = self.normalize_email(email) 11 user = self.model(email=email, **extra_fields) 12 user.set_password(password) 13 user.save(using=self._db) 14 return user 15 16 def create_user(self, email, password=None, **extra_fields): 17 """is_staff(管理サイトにログインできるか)と、is_superuer(全ての権限)をFalseに""" 18 extra_fields.setdefault('is_staff', False) 19 extra_fields.setdefault('is_superuser', False) 20 return self._create_user(email, password, **extra_fields) 21 22 def create_superuser(self, email, password, **extra_fields): 23 """スーパーユーザーは、is_staffとis_superuserをTrueに""" 24 extra_fields.setdefault('is_staff', True) 25 extra_fields.setdefault('is_superuser', True) 26 27 if extra_fields.get('is_staff') is not True: 28 raise ValueError('Superuser must have is_staff=True.') 29 if extra_fields.get('is_superuser') is not True: 30 raise ValueError('Superuser must have is_superuser=True.') 31 32 return self._create_user(email, password, **extra_fields)
試したこと
原因がdef _create_userのif not email:部分なので、コードを消したらログインする事が出来ましたが、
ただ、別のアカウンでログインが出来てしまいます(同じユーザーとして処理される)
また、settings.pyに
SOCIAL_AUTH_USERNAME_IS_FULL_EMAIL = False
SOCIAL_AUTH_PROTECTED_USER_FIELDS = ['email',]
などを追加しましたが同じエラーとなり効果がアリませんでした。
補足情報(FW/ツールのバージョンなど)
social-auth-app-django 4.0.0
social-auth-core 3.3.3
django 2.1
あなたの回答
tips
プレビュー