Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Facebook 设计并全然记住OAuth_Facebook_Devise_Ruby On Rails 3_Omniauth - Fatal编程技术网

Facebook 设计并全然记住OAuth

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在请

所以,我刚刚使用Rails 3、Desive和OmniAuth via进行了设置

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

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)