在Rails中使用devise + omniauth的多个模型

时间:2013-12-27 09:21:12

标签: ruby-on-rails facebook devise omniauth

我正在使用devise + omniauth在我的网站上启用facebook / linkedin / twitter登录。

我有多个模型,角色完全不同,都需要社交登录,我现在已经成功使用了devise + omniauth,因为我只需要登录一次。

然而现在设计给出了错误,说我不能在多个模型上使用omniauthable。

我环顾四周,有人非常乐于帮助创建this wiki,解释如何在不使用omniauthable模块的情况下使用omniauth。

但是我认为既然我想将它用于不同的模型,我将不得不使用不同的路径进行注册,这个wiki没有解释。

我查看了omniauth,它有关于选项request_path和callback_path的一些稀缺细节似乎是相关的,但我无法弄清楚究竟需要做什么。

非常感谢任何帮助。

修改 这就是我到目前为止所做的。

# omniauth.rb

Rails.application.config.middleware.use OmniAuth::Builder do
    FACEBOOK_AUTH_REGEX = /^\/(model1|model2)\/auth\/facebook\/$/
    FACEBOOK_CALLBACK_REGEX = /^\/(model1|model2)\/auth\/facebook\/callback\/$/

    LINKEDIN_AUTH_REGEX = /^\/(model1|model2)\/auth\/linkedin\/$/
    LINKEDIN_CALLBACK_REGEX = /^\/(model1|model2)\/auth\/linkedin\/callback\/$/

    facebook_callback_path = lambda do |env|
        env["PATH_INFO"] =~ FACEBOOK_CALLBACK_REGEX
    end

    linkedin_callback_path = lambda do |env|
        env["PATH_INFO"] =~ LINKEDIN_CALLBACK_REGEX
    end

    facebook_request_path = lambda do |env|
        match_data = FACEBOOK_AUTH_REGEX.match env["PATH_INFO"]
        if match_data
            "/#{match_data[1]}/auth/facebook/callback/"
        end
    end
    linkedin_request_path = lambda do |env|
        match_data = LINKEDIN_AUTH_REGEX.match env["PATH_INFO"]
        if match_data
            "/#{match_data[1]}/auth/linkedin/callback/"
        end
    end
    provider :facebook, FACEBOOK_ID, FACEBOOK_SECRET, :callback_path => facebook_callback_path, :request_path => facebook_request_path
    provider :linkedin, LINKEDIN_ID, LINKEDIN_SECRET, :callback_path => linkedin_callback_path, :request_path => linkedin_request_path
end

#routes.rb
match "/:model_name/auth/:provider/callback/", :to => "recruiter_omniauth_callbacks#sync"

它似乎适用于linkedin,但在facebook我得到

{"error":{"message":"Error validating verification code. Please make sure your redirect_uri is identical to the one you used in the OAuth dialog request","type":"OAuthException","code":100}}

不确定为什么我得到这个,它说的两个网址应该是相同的,我认为我正在使用:model_name / auth / facebook / callback / everywhere所以不确定它有什么问题。

任何帮助?

1 个答案:

答案 0 :(得分:0)

我发布了一个类似案例here的示例,其中包含攻击该问题的其他视角,希望它有所帮助,问候!