【发布时间】:2013-12-27 09:21:12
【问题描述】:
我正在使用 devise + omniauth 在我的网站上启用 facebook/linkedin/twitter 登录。
我有多个角色完全不同的模型,并且都需要社交登录,我现在一直在成功使用 devise+omniauth,因为我只需要一次登录。
但是现在 devise 给出了错误,说我不能在多个模型上使用omniauthable。
我环顾四周,有人帮助创建this wiki,解释如何在没有omniauthable 模块的情况下将omniauth 与devise 一起使用。
但我想既然我想将它用于不同的模型,我将不得不使用不同的注册路径,这个 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/ 所以不确定它有什么问题。
有什么帮助吗?
【问题讨论】:
标签: ruby-on-rails facebook devise omniauth