Ruby on rails OmniAuth Facebook过期令牌错误

Ruby on rails OmniAuth Facebook过期令牌错误,ruby-on-rails,ruby,facebook,rubygems,omniauth,Ruby On Rails,Ruby,Facebook,Rubygems,Omniauth,我正在使用OmniAuth在我的应用程序中访问Facebook。我正在使用fb_图形gem:发布到Facebook。我正在Heroku上为此应用程序运行omniauth-0.3.0。创建用户时保存的令牌在用户稍后登录时更改 用于创建用户的代码 class SessionsController < ApplicationController def create auth = request.env["omniauth.auth"] user

我正在使用OmniAuth在我的应用程序中访问Facebook。我正在使用fb_图形gem:发布到Facebook。我正在Heroku上为此应用程序运行omniauth-0.3.0。创建用户时保存的令牌在用户稍后登录时更改

用于创建用户的代码

    class SessionsController < ApplicationController  
    def create  
     auth = request.env["omniauth.auth"]  
     user = User.find_by_provider_and_uid(auth["provider"], auth["uid"])||           
     User.create_with_omniauth(auth)
       session[:user_id] = user.id  
       redirect_to root_url, :notice => "Signed in!"  
         end 
我现在在大约30%的用户身上看到了这个错误-

 FbGraph::InvalidToken (OAuthException :: Error validating access token: Session does not match current stored session. This may be because the user changed the password since the time the session was created or Facebook has changed the session for security reasons.)
我看到OmniAuth最近已经解决了过期令牌问题:

我使用此代码尝试刷新访问令牌。然而,我仍然得到同样的错误。有人能指出我遗漏了什么吗是否有其他方法可以在用户每次登录时更新令牌?

唯一有效的解决方案是每次用户登录时创建一个新用户(我根本不喜欢这个解决方案):


谢谢

创建会话时,只需更新令牌即可

class SessionsController < ApplicationController  
def create  
  auth = request.env["omniauth.auth"]  
  user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]).tap do |u|
           u.update_attributes(:token => auth["credentials"]["token"]) if u
         end || User.create_with_omniauth(auth)
  session[:user_id] = user.id  
  redirect_to root_url, :notice => "Signed in!"  
end 
class sessioncontrollerauth[“credentials”][“token”]),如果
结束| |用户。使用_omniauth(auth)创建
会话[:user\u id]=user.id
将\u重定向到root\u url,:notice=>“已登录!”
结束

在您回答此问题之前,我使用了类似的解决方案-

  class SessionsController < ApplicationController  
  def create  
 auth = request.env["omniauth.auth"]  
 user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) ||  User.create_with_omniauth(auth)  

 user.update_attributes(:token => auth["credentials"]["token"])

 session[:user_id] = user.id  
 redirect_to root_url, :notice => "Signed in!"  

  end
class sessioncontrollerauth[“credentials”][“token”])
会话[:user\u id]=user.id
将\u重定向到root\u url,:notice=>“已登录!”
结束

在这种情况下,我们不能使用FBGraph gem和folling方法刷新令牌吗

auth = FbGraph::Auth.new(CLIENT_ID, CLIENT_SECRET)
auth.exchange_token! access_token # Needs fb_graph 2.3.1+
auth.access_token # => new token
但是,这不会延长令牌的到期时间,而是将令牌替换为新令牌。有效期将保持不变。与FB核实后,他们可能不允许将FB代币有效期延长超过60天。 令牌的最大有效期为60天


参考资料:

谢谢您的回复。我有一个问题-我正在使用omniauth使用FB登录。FB令牌会不时更改,因此当用户在登录后很长时间内使用应用程序时,令牌可能会更改。为了解决这个问题,我现在正在使用“脱机访问”权限,以便FB生成长寿命令牌。有没有一种不用“离线访问”就能解决这个问题的方法。它可能需要我的应用程序在发布到Facebook之前(登录后的任何时间)通过omniauth请求续订令牌。有没有其他方法可以解决这个问题?根据我的经验,只有当用户在Facebook上更改密码时,才会使用“offline_access”设置更改令牌。除此之外,代币一年多来一直保持不变。当密码更改时,他们必须再次登录才能获得新的令牌,如上所述。我同意你的说法。设置“脱机访问”时,令牌未更改。但是,我想知道如果没有“离线访问”设置,我如何处理它?(“offline_access”是用户的附加权限,因此可能会引起一些用户的摩擦,这些用户可能不希望应用程序“随时访问他们的数据”),我看到了omniauth的这一变化,它尝试刷新过期的令牌-。但我不知道如何在我的代码中使用它。上一条评论中链接的新URL:
  class SessionsController < ApplicationController  
  def create  
 auth = request.env["omniauth.auth"]  
 user = User.find_by_provider_and_uid(auth["provider"], auth["uid"]) ||  User.create_with_omniauth(auth)  

 user.update_attributes(:token => auth["credentials"]["token"])

 session[:user_id] = user.id  
 redirect_to root_url, :notice => "Signed in!"  

  end
auth = FbGraph::Auth.new(CLIENT_ID, CLIENT_SECRET)
auth.exchange_token! access_token # Needs fb_graph 2.3.1+
auth.access_token # => new token