django-allauthを利用してソーシャルログイン機能を実装する際に、メール情報が取得できずにハマりました。
せっかくなので、その事象と原因、対応策をこの記事に残しておきます。
起きた事象
試していたことは、django-allauthを利用してgoogleソーシャルログインをできるようにするというものです。
公式ドキュメントやqiita記事にある通りに実装することで、ログインできるとこまでは確認したのですが、作成されたアカウント情報を見ると、なぜかメールアドレスが空という事象が発生しました。
図:googleソーシャルログイン後に、作成されたアカウントの中身(管理画面で確認)
原因
結論、googleプロバイダのscopeを適切に設定できていなかったことが原因です。
django-allauthが標準で持つgoogleプロバイダは、デフォルトのscopeをprofile
のみに設定しています。
profile
APIからのレスポンスにはメールアドレス情報は存在しません。よって、そもそも情報をgoogleから得られていなかったので、今回の事象は発生したということになります。
では、どう対処するのかというと、、、
「メールアドレス情報をくれるAPI」をscopeに追加するということが解決策になります。
ちなみにgoogleの場合、そのAPIの名前はemail
です。
- scopeってなんだよ?という方はこちら ➡ OAuth2 スコープの操作 | Apigee | Google Cloud
- googleが提供しているOAuth2.0のAPIはこちら ➡ OAuth 2.0 Scopes for Google APIs
対処法
対処法としては、以下の2つのどちらかを行えばOKです。
- settings.pyにて、
ACCOUNT_EMAIL_REQUIRED=True
と設定する - settings.pyにて、
SOCIALACCOUNT_PROVIDERS
でgoogleプロバイダのscope設定をする
1. settings.pyにて、ACCOUNT_EMAIL_REQUIRED=True
と設定する
...
ACCOUNT_EMAIL_REQUIRED=True
...
この設定をすると、googleに限らず他のプロバイダでもメールアドレス情報が取得できるよう、django-allauthが良しなにやってくれます。
例えばgoogleプロバイダの場合、profile
APIのほかにemail
APIも、デフォルトのscopeに勝手に追加される形になります。(詳しくは、githuで確認してください)
2. settings.pyにて、SOCIALACCOUNT_PROVIDERS
でgoogleプロバイダのscope設定をする
SOCIALACCOUNT_PROVIDERS = {
'google': {
'SCOPE': [
'profile',
'email',
],
},
}
この設定では、1の方法とは違って直接利用するAPIを指定しています。
まとめ
以上、django-allauthにて、プロバイダからメール情報が取得できない事象の原因と対処法でした。