OAuth認証をする
sorcery (0.8.5)
rails (4.1.1)
原因
原因はcreate_fromメソッドの中で User#save(validation: false) されているため。
https://github.com/NoamB/sorcery/blob/db47df2c448cbab1ef8fc68d81d697a84c9cd585/lib/sorcery/controller/submodules/external.rb#L199
じゃあどうするの
create_fromの代わりにcreate_and_validate_fromを使えばよい。
https://github.com/NoamB/sorcery/blob/db47df2c448cbab1ef8fc68d81d697a84c9cd585/lib/sorcery/controller/submodules/external.rb#L150
create_fromは、セーブされたUserインスタンスを返すんだけど、create_and_validate_from は new_record なUesrインスタンスが帰ってくる。
このインスタンスをOAuth用のnewアクションのテンプレートにアサインして、ここでアカウント名/Emailをユーザに入力してもらう。
そして外部サービスの情報(uidやprovider)はsessionに入っているので、createアクションでそのsessionをソースにauthenticationレコードをbuildすればよい。
def create @user = User.new(user_params) @user.authentications.build(session[:incomplete_user][:provider]) if @user.save reset_session # session fixtion対策 auto_login(@user) redirect_to root_url, notice: 'ログインしました' end end
この流れはQiitaの登録フローと同じ。
OK牧場。