Devise和OmniAuth记住OAuth

Eri*_*son 18 facebook devise omniauth ruby-on-rails-3

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

我通过Facebook成功验证了用户身份,但尽管被标记为以下内容,但它们并非"可记忆":

devise [...]: rememberable, :omniauthable
Run Code Online (Sandbox Code Playgroud)

我试着打电话:

@the_user.remember_me!
Run Code Online (Sandbox Code Playgroud)

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

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

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

har*_*tin 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
Run Code Online (Sandbox Code Playgroud)

然后更改"使用facebook登录"链接以使用新路线:

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

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

这个解决方案适用于我使用Rails 3.1和Devise 1.4.9.


Jer*_*ijk 11

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

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

/users/auth/facebook?auth_token=TnMn7pjfADapMdsafOFIHKgJVgrBEbjKqrubwMXUca0n16m3Hzr7CnrP1s4z
Run Code Online (Sandbox Code Playgroud)

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

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

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


mus*_*ran 11

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

user.remember_me = true
# then add your signing in code 
sign_in(:user, user)
Run Code Online (Sandbox Code Playgroud)

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