1
  1. 用户使用传统的电子邮件和密码登录。
  2. 该用户单击“与 Facebook 连接”按钮。
  3. 他们使用与他们当前登录我网站时使用的电子邮件地址不同的电子邮件地址在facebook 上进行身份验证。
  4. 我向他们展示了一个页面,询问他们是否想更新他们的传统登录以使用他们的 Facebook 电子邮件(也允许我统一帐户并使用 Facebook 填写任何缺失的数据)。

问题出在第 4 步,因为omniauth 回调 URLsessions#create与存储在request.env['omniauth.auth'].

的相关位sessions_controller

def create
  return link_accounts if signed_in?

  if params[:email]
    create_session_from_login
  elsif env['omniauth.auth']
    create_session_from_facebook
  else
    redirect_to login_path, alert: "Couldn't login!"
  end
end 

private

def link_accounts
  auth = env['omniauth.auth']
  redirect_to user_link_accounts_path current_user unless current_user.email == auth[:info][:email]
end

...这会将我带到我的用户控制器,它会显示一条可爱的小消息,提示用户(a)以其他用户身份登录我的网站,或(b)更新他们的帐户以使用此 Facebook 信息...除了我再也无法访问request.env['omniauth.auth'].

如何在请求之间保留身份验证信息?它太大了session......我也希望它在用户在页面上执行操作后可以到达它(例如,单击链接 - 所以我可以在实际 FB 身份验证之后在服务器端对它们进行身份验证已经发生),但我不想将它存储在页面上......

4

0 回答 0