Facebook 设计并全然记住OAuth
所以,我刚刚使用Rails 3、Desive和OmniAuth via进行了设置 我正在通过Facebook成功验证用户身份,但尽管标记为:Facebook 设计并全然记住OAuth,facebook,devise,ruby-on-rails-3,omniauth,Facebook,Devise,Ruby On Rails 3,Omniauth,所以,我刚刚使用Rails 3、Desive和OmniAuth via进行了设置 我正在通过Facebook成功验证用户身份,但尽管标记为: devise [...]: rememberable, :omniauthable 我试着打电话: @the_user.remember_me! …毫无用处。未存储/设置cookie,这意味着用户不会在会话之间持久化 有没有人通过cookies从FB获取用户信息?在我看来,这应该是自动发生的 感谢你们提供的任何想法或反馈。我同意你们希望Desive在请
devise [...]: rememberable, :omniauthable
我试着打电话:
@the_user.remember_me!
…毫无用处。未存储/设置cookie,这意味着用户不会在会话之间持久化
有没有人通过cookies从FB获取用户信息?在我看来,这应该是自动发生的
感谢你们提供的任何想法或反馈。我同意你们希望Desive在请求发送到FB之前设置一个会话。我想这是Desive缺少的一个功能 我自己在使用token_authenticatable时遇到了问题。api客户端正在直接调用以下url:
/users/auth/facebook?auth_token=TnMn7pjfADapMdsafOFIHKgJVgrBEbjKqrubwMXUca0n16m3Hzr7CnrP1s4z
因为我使用的是token_authenticatable,所以我假设这会让用户登录。不幸的是,这不是开箱即用的。要使其正常工作,您必须确保用户在进入此路径之前已登录。您可以通过其他方式完成此操作,但最简单的方法是为API客户端提供不同的url(在本例中为“users/connect/facebook”)。以下是我添加到routes文件中的内容,使其能够工作(假设您有一个带有Desive的用户模型,并且没有更改默认值):
这将确保正确创建会话,以便用户从facebook返回时被识别。我想详细说明@jeroen van dijk给出的(正确)答案,它对我有用 在config/routes.rb中,在designe_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) %>
应用程序内/controllers/user_omniauth_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
class UserOmniAuthCallbackController
使用Rails 3.1和Desive 1.4.9,此解决方案对我来说效果很好。它由Desive贡献者修复: 你应该加上
user.remember_me = true
# then add your signing in code
sign_in(:user, user)
ref:仅供参考-如果您还想在DeVICE中使用延长记忆周期功能,则需要在回调控制器中的用户对象上强制执行此操作 在@mustafaturan的回答中添加了一行
user.remember_me = true
user.extend_remember_period = true
# then add your signing in code
sign_in(:user, user)
如何“给”API客户端另一个URL?在config/initializers/designe.rb中的某个地方?我错过了在控制器上而不是在模型上记住我的调用。在包含正确的模块后,终于让它工作了。在Rails 3.2.3和designe 2.1.2上,添加了“include”行和“记住我()打电话就足够了。我不需要改变任何路线。@haraldmartin我尝试了所有的解决方案,但它们对我不起作用,我在下面的帖子中开始了一个新问题。你能帮我吗?谢谢Fabrizio这应该是正确的答案,我已经搜索了一整天,你应该在登录和重定向之前设置它
user.remember_me = true
user.extend_remember_period = true
# then add your signing in code
sign_in(:user, user)