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