亲爱的优秀人才:
我正在开发Rails 3.2.12上的Ruby应用程序(我还是新手)。
我正在努力让Devise与Omniauth合作......我正在尝试的第一个策略是Google_oauth2。
我选择了我想在Google上使用的凭据后,我已将其重新定向到我的localhost:3000实例。
这次重定向回到localhost后,我看到一个闪光通知:
Could not authenticate you from GoogleOauth2 because "Csrf detected".
服务器日志包含:
Started GET "/users/auth/google_oauth2" for 127.0.0.1 at 2013-03-21 08:57:01 -0400
(google_oauth2) Callback phase initiated.
(google_oauth2) Callback phase initiated.
(google_oauth2) Authentication failure! invalid_credentials: OmniAuth::Strategie
s::OAuth2::CallbackError, OmniAuth::Strategies::OAuth2::CallbackError
Started GET "/users/auth/google_oauth2/callback?state=7849a3762d07e7f89e69b4aa46
7efc7b7b2c21655193396b&code=4/v-dSBwAvQUUZL87iNV_yk_Z8s_x0.cnqsdbDX4gUYaDn_6y0ZQ
NgQ9hAaewI" for 127.0.0.1 at 2013-03-21 08:57:40 -0400
Processing by OmniauthCallbacksController#failure as HTML
Parameters: {"state"=>"7849a3762d07e7f89e69b4aa467efc7b7b2c21655193396b", "cod
e"=>"4/v-dSBwAvQUUZL87iNV_yk_Z8s_x0.cnqsdbDX4gUYaDn_6y0ZQNgQ9hAaewI"}
Redirected to http://localhost:3000/users/sign_in
Completed 302 Found in 0ms (ActiveRecord: 0.0ms)
我注意到,如果我直接将回调网址放入浏览器,而不提供任何参数,我会得到完全相同的结果。
http://localhost:3000/users/auth/google_oauth2/callback
我可以尝试什么?我还可以提供哪些其他信息?
答案 0 :(得分:11)
回答我自己的帖子......我已经过去了。我不完全确定为什么,但我有一些可能值得传递的线索。
报告了与omniauth-facebook策略相关的一系列其他类似问题。他们似乎并不适用于谷歌,所以我看起来并不太深。然后我尝试配置FB策略,并遇到了同样的问题。 FB解决方案是将omniauth-facebook gem恢复为1.4.0。
gem 'omniauth-facebook', '1.4.0'
这也会自动恢复omniauth-oauth2宝石(我还没有把我的脑袋缠在宝石上)。当我再次尝试谷歌链接时,它没有抛出相同的Csrf检测到的消息...嗯......还原FB宝石固定谷歌----在这里需要免责声明,其他的事情可能是这里的问题,但我我认为我说得对。
还有另一个值得一提的问题。上面提供的日志显示了2条重复的日志消息......
(google_oauth2) Callback phase initiated.
(google_oauth2) Callback phase initiated.
这揭示了另一个(可能是相关的)问题。这意味着回调被执行了两次。一旦我解决了CSRF问题,我就开始自己解决了invalid_credentials问题。错误的原因是重复的回调调用。显然,Oauth2只允许一次使用凭证。第二次使用无效。
我使用railscast#235作为我的向导: http://railscasts.com/episodes/235-devise-and-omniauth-revised?autoplay=true
我在omniauth.rb初始化程序中添加了“provider”调用。和config.omniauth在devise.rb初始化程序中调用。我想这些会以某种方式导致重复的回调?!?!?
从omniauth.rb中删除条目让我超越了那个。
所以你有它。我的第二个问题,我的第二个问题,我是唯一的回应者。不确定是因为它们是愚蠢还是硬...我希望后者。
答案 1 :(得分:5)
我遇到了同样的问题。在我的情况下,我已经在devise.rb和omniauth.rb中初始化了google-oauth凭据。因此,回调发生了两次。从devise.rb中删除google-oauth凭据后,此CSRF令牌问题得到了解决。
答案 2 :(得分:4)
偶然发现了这个问题,但你的修复对我不起作用。我使用以下宝石版本;
oauth2 (0.8.1)
omniauth (1.1.4)
omniauth-oauth2 (1.1.1)
omniauth-facebook (1.4.1)
omniauth-google-oauth2 (0.2.1)
修复了我的问题是将omniauth.rb初始化程序调整为以下内容;
OmniAuth.config.full_host = "http://localhost:3000"
Rails.application.config.middleware.use OmniAuth::Builder do
provider :facebook, KEY, SECRET,
provider :google_oauth2, KEY, SECRET, :scope => "userinfo.email,userinfo.profile"
end
关键部分是为google_oauth2添加'scope'参数,否则我将失败。
我的安装基于此博客:http://sreeharikmarar.blogspot.com.au/2013/01/omniauth-devise-authentication-using.html