Open1

Django-Social-Authのpipelineにおけるis_new, new_associationメモ

rocky_manobirocky_manobi

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