質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

0回答

1350閲覧

social-auth-app-djangoを使ってTwitterアカウントを使用したログインを実現させたいです!

nre

総合スコア35

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Twitter

Twitterは、140文字以内の「ツイート」と呼ばれる短文を投稿できるサービスです。Twitter上のほぼ全ての機能に対応するAPIが存在し、その関連サービスが多く公開されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2020/11/20 07:42

前提・実現したいこと

現在、転職用のポートフォリオとして会員登録制の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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問