所以,我刚刚通过https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview使用Rails 3,Devise和OmniAuth进行设置。
我已成功通过Facebook对用户进行身份验证,但尽管标有以下内容,但这些用户并非“可记住”:
devise [...]: rememberable, :omniauthable
我试着打电话:
@the_user.remember_me!
......无济于事。没有存储/设置cookie,这意味着用户不会在会话中持续存在。
有没有人设法通过Cookie记住来自FB的用户?在我看来,这应该是自动发生的。
感谢您提出的任何想法或反馈。
答案 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)