【问题标题】:omniauth google-oauth2 with devise - invalid_credentials and "Csrf detected"带有设计的omniauth google-oauth2 - invalid_credentials 和“检测到Csrf”
【发布时间】:2013-03-21 13:40:53
【问题描述】:

尊敬的 SO 的好人:

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

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

在选择我想在 Google 中使用的凭据后,Google 已将其重定向回我的 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

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

【问题讨论】:

标签: devise ruby-on-rails-3.2 omniauth google-oauth


【解决方案1】:

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

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

gem 'omniauth-facebook', '1.4.0'

这也自动恢复了omniauth-oauth2 gem(我还没有完全理解gem)。当我再次尝试谷歌链接时,它没有抛出相同的 Csrf 检测消息......嗯......恢复 FB gem 修复谷歌----这里需要一个免责声明,其他事情可能是这里的问题,但我我觉得我说得对。

还有一个问题值得一提。我上面提供的日志显示了 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 问题,以及我是唯一响应者的第二个问题。不知道是因为他们笨还是硬……我希望是后者。

【讨论】:

  • 好吧,我的朋友你可以更安心,没有人回答,因为这个问题真的很难!我现在也有同样的问题,谷歌、Linkedin 和 Twitter :( 所以,你说我必须从omniauth.rb 中删除一行,对吧?我有点搞砸了,我没有那个文件,然后呢?
  • 我的omniauth.rb 文件位于一个不起眼的地方... config/initializers/omniauth.rb。如果你没有,我会四处寻找其他可能的重复项?
  • 删除 omniauth.rb 有效。在 RailsCast 之后我遇到了同样的问题。但是在关注guide on the Devise wiki 时,您只需在 config/initializers/devise.rb 中使用config.omniauth :facebook, "APP_ID", "APP_SECRET", :strategy_class => OmniAuth::Strategies::Facebook 配置 OmniAuth。
  • 您是如何解决凭据无效问题的?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    刚刚偶然发现这个问题,但您的修复对我不起作用。我正在使用以下 gem 版本;

    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 添加“范围”参数,否则我会遇到身份验证失败。

    我安装了这个博客:http://sreeharikmarar.blogspot.com.au/2013/01/omniauth-devise-authentication-using.html

    相关帖子:OmniAuth using google oauth 2 strategy scope failure

    【讨论】:

      猜你喜欢
      • 2014-04-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-18
      相关资源
      最近更新 更多