rails app ruby-on-rails ruby facebook rubygems omniauth

ruby-on-rails - rails app



OmniAuth Facebook expiró error de token (3)

¿No podemos actualizar el token usando la gema FBGraph con el siguiente método?

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

Sin embargo, esto no extenderá la caducidad del token, pero reemplazará el token por uno nuevo. El tiempo de vencimiento seguirá siendo el mismo. Lo verifiqué con FB, es posible que no permitan extender el vencimiento del token FB más de 60 días. La validez máxima del token es de 60 días.

referencia: https://github.com/nov/fb_graph/wiki/Authentication#wiki-extend-token-expiry

Estoy usando OmniAuth para tener acceso a Facebook en mi aplicación. Estoy usando la gema fb_graph: https://github.com/nov/fb_graph para publicar en Facebook. Estoy ejecutando omniauth-0.3.0 en Heroku para esta aplicación. El token que guardo cuando se crea el usuario se cambia cuando el usuario inicia sesión más tarde.

Código para crear usuario

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

El modelo de usuario es:

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

Ahora estoy viendo este error en aproximadamente 30% de usuarios-

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

Vi que el problema del token caducado se ha corregido recientemente en OmniAuth:

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

Usé este código que intenta actualizar el token de acceso. Sin embargo, sigo teniendo el mismo error. ¿Alguien puede señalar lo que me estoy perdiendo? ¿Hay alguna otra forma en que pueda actualizar el token cada vez que el usuario inicie sesión?

La única solución que ha funcionado es crear un nuevo usuario cada vez que el usuario inicia sesión (esta solución no me gusta para nada):

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

¡Gracias!


Simplemente puede actualizar el token cuando crea la sesión.

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


Estaba usando una solución similar antes de responder esta pregunta-

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