9

亲爱的SO的好人:

我正在 Rails 3.2.12 上开发一个 Ruby 应用程序(我还是新手)。

我正在尝试让 Devise 与 Omniauth 合作……我尝试的第一个策略是 Google_oauth2。

在选择了我想在谷歌中使用的凭据后,我让它工作到谷歌重定向回我的 localhost:3000 实例的地步。

在此重定向回 l​​ocalhost 后,我​​看到一个快速通知:

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)

我注意到,如果我只是将回调 URL 直接放入浏览器,而不提供任何参数,我会得到完全相同的结果。

http://localhost:3000/users/auth/google_oauth2/callback

我可以尝试什么?我还能提供哪些其他信息?

4

3 回答 3

11

回答我自己的帖子....我已经过去了。我不完全确定为什么,但我有一些可能值得传递的线索。

还有许多其他与omniauth-facebook 策略相关的类似问题。他们似乎没有适用于谷歌,所以我没有看太深。然后我尝试配置FB策略,也遇到了同样的问题。FB 解决方案是将omniauth-facebook gem 恢复到1.4.0。

gem 'omniauth-facebook', '1.4.0'

这也自动恢复了omniauth-oauth2 gem(我还没有把头缠在gem上)。当我再次尝试 google 链接时,它没有抛出相同的 Csrf 检测消息...嗯...恢复 FB gem 固定 google ----这里需要免责声明,其他事情可能是这里的问题,但我认为我说得对。

还有一个问题值得一提。我上面提供的日志显示了 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 初始化程序中添加了“提供者”调用。和 config.omniauth 在 devise.rb 初始化程序中调用。我猜这些会导致重复的回调?!?!?

从omniauth.rb 中删除条目让我超越了那个条目。

So there you have it. My second SO question, and my second question where I'm the only responder. Not sure if its because they were dumb or hard... I hope the latter.

于 2013-03-21T21:25:05.337 回答
5

我有同样的问题。就我而言,我已经在 devise.rb 和 omniauth.rb 中初始化了 google-oauth 凭据;因此,回调发生了两次。从 devise.rb 中删除 google-oauth 凭据后,这个 CSRF 令牌问题得到了解决。

于 2014-02-25T23:05:46.197 回答
4

Just stumbled onto this issue, but your fix didn't work for me. I am using the following gem versions;

oauth2 (0.8.1)
omniauth (1.1.4)
omniauth-oauth2 (1.1.1)
omniauth-facebook (1.4.1)
omniauth-google-oauth2 (0.2.1)

What did fix my problem was adjusting my omniauth.rb initialiser to the following;

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

The key part was to add the 'scope' parameter for google_oauth2, without which I was getting auth failures.

I based my install of this blog: http://sreeharikmarar.blogspot.com.au/2013/01/omniauth-devise-authentication-using.html

A related post: OmniAuth using google oauth 2 strategy scope failure

于 2013-10-24T09:09:36.480 回答