18

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

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

devise [...]: rememberable, :omniauthable

我试着打电话:

@the_user.remember_me!

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

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

感谢你们可能有的任何想法或反馈。

4

4 回答 4

19

我想详细说明上面对我有用的@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。

于 2012-02-02T12:00:29.243 回答
11

我同意您希望 Devise 在请求发送到 FB 之前设置会话。我想这是设计的一个缺失的功能。

我自己在使用 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 返回时被识别。

于 2011-01-13T11:40:13.990 回答
11

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

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

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

于 2012-12-09T09:54:38.593 回答
0

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

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

user.remember_me = true
user.extend_remember_period = true

# then add your signing in code 
sign_in(:user, user)
于 2014-05-07T16:43:45.073 回答