Help us understand the problem. What is going on with this article?

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

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にて、プロバイダからメール情報が取得できない事象の原因と対処法でした。

参考

pankhazard_0909
都内のfintechベンチャーで勤務してます。 覚えたことをつらつらと投稿します。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away