【问题标题】:Devise and OmniAuth remembering OAuth设计和 OmniAuth 记住 OAuth
【发布时间】:2011-05-27 10:03:30
【问题描述】:

所以,我刚刚通过 https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview 使用 Rails 3、Devise 和 OmniAuth 进行了设置。

我已通过 Facebook 成功验证用户身份,但尽管他们被标记为:

devise [...]: rememberable, :omniauthable

我试过打电话:

@the_user.remember_me!

...无济于事。没有 cookie 被存储/设置,这意味着用户不会跨会话持续存在。

有没有人设法通过 cookie 记住来自 FB 的用户?在我看来,这应该是自动发生的。

感谢你们提出的任何想法或反馈。

【问题讨论】:

    标签: facebook devise ruby-on-rails-3 omniauth


    【解决方案1】:

    我想详细说明@jeroen-van-dijk 在上面给出的对我有用的(正确)答案。

    在 config/routes.rb 中,在 devise_for 块中添加一条新路由:

    devise_for :users, :controllers => {
                         :omniauth_callbacks => "user_omniauth_callbacks" } do
      ...
      get '/users/connect/:network', :to => redirect("/users/auth/%{network}"),
                                     :as => 'user_oauth_connect'
    
    end
    

    然后更改您的“使用 facebook 登录”链接以使用新路由:

    <!-- before it linked to user_omniauth_authorize_path -->
    <%= link_to "Sign in using Facebook", user_oauth_connect_path(:facebook) %>
    

    在 app/controllers/user_omnniauth_callbacks_controller.rb 中

    class UserOmniauthCallbacksController < Devise::OmniauthCallbacksController
      include Devise::Controllers::Rememberable
    
      def facebook
        @user = User.find(...)
        ...
        remember_me(@user) # set the remember_me cookie
      end
    end
    

    这个解决方案对我使用 Rails 3.1 和 Devise 1.4.9 很有效。

    【讨论】:

    • 一开始我错过了控制器而不是模型上对 remember_me 的调用。在包含正确的模块后终于让它工作了。
    • 在 Rails 3.2.3 和 Devise 2.1.2 上,添加“include”行和“remember_me()”调用就足够了。我不必更改任何路由。
    • @haraldmartin 我尝试了所有解决方案,但它们对我不起作用,我将在下一篇文章中提出一个新问题。请你帮助我好吗?谢谢法布里齐奥stackoverflow.com/questions/42280622/…
    【解决方案2】:

    我同意您希望 Devise 在请求发送到 FB 之前设置会话。我猜这是 Devise 缺少的功能。

    我自己在使用 token_authenticable 时遇到了问题。一个 api 客户端直接调用了以下 url:

    /users/auth/facebook?auth_token=TnMn7pjfADapMdsafOFIHKgJVgrBEbjKqrubwMXUca0n16m3Hzr7CnrP1s4z
    

    因为我使用的是 token_authenticable,所以我假设这会登录用户。不幸的是,这不是开箱即用的。要使这项工作正常进行,您必须确保用户在到达此路径之前已登录。您可以通过其他方式执行此操作,但最简单的方法是为 API 客户端提供不同的 url(在本例中为“users/connect/facebook”。这是我对使其工作的路由文件的补充(假设您有具有设计的用户模型并且您没有更改默认值):

    authenticate :user do
      get 'users/connect/:network', :to => redirect("/users/auth/%{network}")
    end
    

    这将确保正确创建会话,以便在用户从 facebook 返回时被识别。

    【讨论】:

    • 您如何“给”API 客户端另一个 URL?在 config/initializers/devise.rb 的某个地方?
    【解决方案3】:

    它由设计贡献者修复: 你应该添加

    user.remember_me = true
    # then add your signing in code 
    sign_in(:user, user)
    

    参考:https://github.com/plataformatec/devise/issues/776#issuecomment-807152

    【讨论】:

    • 这应该是正确的答案,我已经搜索了一整天,你应该在sign_in_and_redirect之前设置这个
    【解决方案4】:

    fyi - 如果您还想在设计中使用 extend_remember_period 功能 - 您需要在回调控制器中的用户对象上强制执行此操作

    在@mustafaturan 的回答中添加了一行

    user.remember_me = true
    user.extend_remember_period = true
    
    # then add your signing in code 
    sign_in(:user, user)
    

    【讨论】:

      猜你喜欢
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-30
      • 2014-10-18
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      相关资源
      最近更新 更多