LoginSignup
4
3

More than 3 years have passed since last update.

django-allauthの認証で、googleからメールアドレスを取得できずにハマった話

Last updated at Posted at 2020-10-03

django-allauthを利用してソーシャルログイン機能を実装する際に、メール情報が取得できずにハマりました。
せっかくなので、その事象と原因、対応策をこの記事に残しておきます。

起きた事象

試していたことは、django-allauthを利用してgoogleソーシャルログインをできるようにするというものです。
公式ドキュメントやqiita記事にある通りに実装することで、ログインできるとこまでは確認したのですが、作成されたアカウント情報を見ると、なぜかメールアドレスが空という事象が発生しました。
not_email.png
 図:googleソーシャルログイン後に、作成されたアカウントの中身(管理画面で確認)

原因

結論、googleプロバイダのscopeを適切に設定できていなかったことが原因です。
django-allauthが標準で持つgoogleプロバイダは、デフォルトのscopeをprofileのみに設定しています。
profileAPIからのレスポンスにはメールアドレス情報は存在しません。よって、そもそも情報をgoogleから得られていなかったので、今回の事象は発生したということになります。

では、どう対処するのかというと、、、
「メールアドレス情報をくれるAPI」をscopeに追加するということが解決策になります。
ちなみにgoogleの場合、そのAPIの名前はemailです。

対処法

対処法としては、以下の2つのどちらかを行えばOKです。
1. settings.pyにて、ACCOUNT_EMAIL_REQUIRED=Trueと設定する
2. settings.pyにて、SOCIALACCOUNT_PROVIDERSでgoogleプロバイダのscope設定をする

1. settings.pyにて、ACCOUNT_EMAIL_REQUIRED=Trueと設定する

setting.py
...
ACCOUNT_EMAIL_REQUIRED=True
...

この設定をすると、googleに限らず他のプロバイダでもメールアドレス情報が取得できるよう、django-allauthが良しなにやってくれます。
例えばgoogleプロバイダの場合、profileAPIのほかにemailAPIも、デフォルトのscopeに勝手に追加される形になります。(詳しくは、githuで確認してください)

2. settings.pyにて、SOCIALACCOUNT_PROVIDERSでgoogleプロバイダのscope設定をする

settings.py
SOCIALACCOUNT_PROVIDERS = {
    'google': {
        'SCOPE': [
            'profile',
            'email',
         ],
    },
}

この設定では、1の方法とは違って直接利用するAPIを指定しています。

まとめ

以上、django-allauthにて、プロバイダからメール情報が取得できない事象の原因と対処法でした。

参考

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3