tas*_*ock 2 ruby-on-rails devise omniauth ruby-on-rails-4
默认色器件的授权路径(即user_omniauth_authorize_path提到这里)似乎被设计成工作都OmniAuth注册和登录。当 OmniauthCallbacksController 收到 auth 时,您的 rails 应用程序通常会使用 auth 信息来创建新用户或更新现有用户,无论用户是打算登录还是注册服务(即 Facebook)。
我的利益相关者要求对身份验证和登录采取不同的行为。如果用户单击“向 Facebook 注册”并且没有使用其 Facebook 电子邮件的帐户,则他们希望继续使用该电子邮件创建一个帐户。但是,如果用户单击“使用 Facebook 登录”并且没有包含其 Facebook 电子邮件的帐户,他们希望向用户显示一条错误消息,说明“您使用的 Facebook 帐户与我们记录中的帐户不匹配。请登录使用您的 barre3 电子邮件和密码”
这个逻辑的位置似乎在 OmniauthCallbacksController 的 Facebook 方法中。将用户的意图(“登录”或“注册”)传递到此回调方法中的最简洁方法是什么?
您可以通过在授权 URL 上添加一些参数来从授权中取回参数以表明用户的意图。
例如:
- if devise_mapping.omniauthable?
- resource_class.omniauth_providers.each do |provider|
= link_to "Sign in with #{provider.to_s.titleize}", omniauth_authorize_path(resource_name, provider, {intent: :sign_in})
Run Code Online (Sandbox Code Playgroud)
(这会创建一个 URL,如:http://whatevs.dev/users/auth/facebook?intent=sign_in)
然后,在回调控制器中(无论你怎么命名):
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def facebook
if env["omniauth.params"]["intent"] == "sign_in"
# Don't create a new identity
else
# Normal flow, such as:
@user = User.from_omniauth(request.env["omniauth.auth"])
sign_in_and_redirect @user
end
end
end
Run Code Online (Sandbox Code Playgroud)