OmniAuth Facebook过期令牌错误[英] OmniAuth Facebook expired token error

本文是小编为大家收集整理的关于OmniAuth Facebook过期令牌错误的处理方法,想解了OmniAuth Facebook过期令牌错误的问题怎么解决?OmniAuth Facebook过期令牌错误问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

我正在使用OmniAuth在我的应用中访问Facebook.我正在使用fb_graph Gem: https://github.com/nov/fb_graph 发布到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 

用户模型是:

  def self.create_with_omniauth(auth)  
    create! do |user|  
    user.provider = auth["provider"]  
    user.uid = auth["uid"]  
    user.name = auth["user_info"]["name"] 
    user.token = auth["credentials"]["token"]
    end
   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中解决:

/p>

我使用了试图刷新访问令牌的代码.但是,我仍然遇到相同的错误.有人可以指出我缺少的东西吗? 每次用户登录时,我是否有其他方法可以更新令牌?

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

  def create  
    auth = request.env["omniauth.auth"] 
    user = User.create_with_omniauth(auth)
    session[:user_id] = user.id  
    redirect_to root_url, :notice => "Signed in!"  
  end

谢谢!

推荐答案

创建会话时,您可以简单地更新令牌.

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

其他推荐答案

在这种情况下,我们不能使用FBGraph Gem刷新令牌?

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天.

参考: https://github.com/nov/nov/fb_graph/wiki/Authentication#Wiki-Extend-Token-Expiry

本文地址:https://www.itbaoku.cn/post/786438.html