Ошибка токена OmniAuth на Facebook истекла - PullRequest
3 голосов
/ 03 октября 2011

Я использую OmniAuth, чтобы получить доступ к Facebook в своем приложении.Я использую гем fb_graph: https://github.com/nov/fb_graph для публикации в Facebook.Я запускаю omniauth-0.3.0 на Heroku для этого приложения.Токен, который я сохраняю при создании пользователя, изменяется, когда пользователь входит в систему позже.

Код для создания пользователя

    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:

https://github.com/soopa/omniauth/commit/67bdea962e3b601b8ee70e21aedf5e6ce1c2b780

Я использовал этот код, который пытается обновить токен доступа.Тем не менее, я все еще получаю ту же ошибку.Может кто-то указать на то, что мне не хватает? Есть ли какой-нибудь другой способ, которым я мог бы обновлять токен каждый раз, когда пользователь входит в систему?

Единственное работающее решение - это создание нового пользователя каждый раз, когда пользователь входит в систему (мне это решение совсем не нравится):

  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

Спасибо!

Ответы [ 3 ]

7 голосов
/ 24 ноября 2011

Вы можете просто обновить токен при создании сеанса.

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 
2 голосов
/ 07 декабря 2011

Я использовал подобное решение, прежде чем вы ответили на этот вопрос-

  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
1 голос
/ 06 февраля 2014

Разве мы не можем обновить токен с помощью гема FBGraph с помощью следующего метода?

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/fb_graph/wiki/Authentication#wiki-extend-token-expiry

...