omn​​iauth google-oauth2 with devise - invalid_credentials和"Csrf detected"

Dou*_*oug 9 devise omniauth ruby-on-rails-3.2 google-oauth

亲爱的优秀人才:

我正在开发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)
Run Code Online (Sandbox Code Playgroud)

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

http://localhost:3000/users/auth/google_oauth2/callback
Run Code Online (Sandbox Code Playgroud)

我该怎么办?我还可以提供哪些其他信息?

Dou*_*oug 11

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

报告了与omniauth-facebook策略相关的一系列其他类似问题.他们似乎并不适用于谷歌,所以我看起来并不太深.然后我尝试配置FB策略,并遇到了同样的问题.FB解决方案是将omniauth-facebook gem恢复为1.4.0.

gem 'omniauth-facebook', '1.4.0'
Run Code Online (Sandbox Code Playgroud)

这也会自动恢复omniauth-oauth2宝石(我还没有把我的脑袋包裹在宝石的周围).当我再次尝试谷歌链接时,它没有抛出相同的Csrf检测到的消息...嗯...还原FB宝石固定谷歌----在这里需要免责声明,其他的事情可能是这里的问题,但我我想我说得对.

还有一个值得一提的问题.我上面提供的日志显示了2条重复的日志消息....

(google_oauth2) Callback phase initiated.
(google_oauth2) Callback phase initiated.
Run Code Online (Sandbox Code Playgroud)

这揭示了另一个(可能是相关的)问题.这意味着回调被执行了两次.一旦我解决了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中删除条目让我超越了那个.

所以你有它.我的第二个问题,我的第二个问题,我是唯一的回应者.不确定它是因为它们是愚蠢还是硬...我希望后者.

  • 删除omniauth.rb有效.我在RailsCast之后遇到了同样的问题.但是当遵循[Devise wiki指南](https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview)时,你只能使用`config.omniauth配置config/initializers/devise.rb中的OmniAuth: facebook,"APP_ID","APP_SECRET",:strategy_class => OmniAuth :: Strategies :: Facebook`. (3认同)

Abh*_*ram 5

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