Devise和OmniAuth记住OAuth

时间:2010-12-17 23:42:16

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

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

我已成功通过Facebook对用户进行身份验证,但尽管标有以下内容,但这些用户并非“可记住”:

devise [...]: rememberable, :omniauthable

我试着打电话:

@the_user.remember_me!

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

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

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

4 个答案:

答案 0 :(得分: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。

答案 1 :(得分:11)

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

我自己遇到了问题,我使用了token_authenticatable。 api客户端直接调用以下URL:

/users/auth/facebook?auth_token=TnMn7pjfADapMdsafOFIHKgJVgrBEbjKqrubwMXUca0n16m3Hzr7CnrP1s4z

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

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

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

答案 2 :(得分:11)

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

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

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

答案 3 :(得分:0)

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

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

user.remember_me = true
user.extend_remember_period = true

# then add your signing in code 
sign_in(:user, user)