Django-Social-Authのpipelineにおけるis_new, new_associationメモ
social_core単体ではなく social_core x social_djangoの話。
TwitterOauth1.1a => TwitterOauth2.0へ移行(provider = "twitter" -> "twitter-oauth2") する際のコードリーディングの記録。
個別の条件
new_association
新規ユーザか否かに関わらず、初めて認証/認可するSocialAccountであることを表す。
SocialAuthの言葉で言えば「以前に同じProvider, 同じuidで認証をしていない」場合にTrueになる。
実装レベルで言えば Model : UserSocialAuth
にレコードが存在しない場合にTrueになる。
is_new
新規にuserを作る必要がある場合にTrueになる。
ログインセッションが生きている状態でpipelineの処理を走らせた場合には当然 False になる(これをやっているのはsocial_django.views.complete
など)。
ログインセッションが生きていない場合は new_association
と同じ値を取る(普通は)。
組み合わせと意味合い
is_new = True, new_association=True
ユーザの新規作成
通常ではprovider毎に別人として扱われるので注意。
別providerの同一人物を判定したい場合はカスタムのパイプラインで「SNSから得られたemailなどを使ってUserを検索して、見つかった場合は is_new=True, user=見つかったUserをセット」などをする必要がありそう。
is_new = True, new_association=False
普通ありえない
is_new = False, new_association=True
ログイン中(セッションが生きている)の状態で、これまでログインしたことにないSNSログインを押した
例: Twitterログインしかしていないユーザがログイン中にGoogleアカウントのログイン設定(OAuth)をした
is_new = False, new_association=False
ログインであると解釈
参考
デフォルトのpipelineで言えうとこのあたりで is_new, new_associationをセットしている
- social_core.pipeline.social_auth.social_user
- social_core.pipeline.user.create_user