OAuth認証をする

sorcery (0.8.5)
rails (4.1.1)

wikiにサンプルあるけどやばいよ

wikiの通りにやっていくとちゃんとユーザ作成までできるのだけど、
このサンプルには、大問題があってValidationがすべて無視されてユーザを作成してしまう。

原因

原因は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_fromnew_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牧場