ruby-on-rails - tutorial - rspec rails devise
Rieles 4.1.5 omniauth parĂ¡metros fuertes (3)
Después de actualizar Rails 4.1.4 a 4.1.5, recibí errores en mi sesión de omniauth de Facebook, todo funcionaba bien desde entonces. Cuando creo una sesión de usuario obtengo un ActiveModel::ForbiddenAttributesError
Ruta:
match ''auth/:provider/callback'', to: ''sessions#create'', as: ''signin'', via: :get
Sesión # crear controlador:
def create
user = User.from_omniauth(env["omniauth.auth"])
session[:user_id] = user.id
session[:user_name] = user.name
redirect_to root_path
end
y un modelo de usuario como este:
def self.from_omniauth(auth)
where(auth.slice(:provider, :uid)).first_or_create.tap do |user|
user.provider ||= auth.provider
user.uid = auth.uid
user.name = auth.info.name
user.save
end
end
¡Puedo omitir el error ActiveModel agregando un permiso! método en mi modelo de usuario así:
where(auth.slice(:provider, :uid).permit!).first_or_create.tap do |user|
Pero anula al primer usuario de la base de datos ... La session[:user_id]
parece ser siempre el primer usuario de la base de datos.
¿No sé si es un problema de parámetros fuertes, un problema de Omniauth o ambos?
He creado un resumen detallado de lo que está sucediendo aquí:
Corrección de seguridad de Rails 4.1.5 rompe Model.where (atributos)
Retazo:
¡YIKES! Rails 4.1.5 requiere que uses parámetros de seguridad para cualquier parámetro donde está_a? Hash Por ejemplo, si estaba haciendo un Model.where utilizando slice para sacar algunas claves de algún objeto que se deriva de Hash, su código lanzará este error cuando migre desde Rails 4.1.4 a Rails 4.1.5:
Ocurrió un ActiveModel :: ForbiddenAttributesError en omniauth_callbacks # facebook: ActiveModel :: ForbiddenAttributesError
Mi solución es así.
# extend the object and add method
auth_hash_extended = auth.slice(:provider, :uid)
def auth_hash_extended.permitted?()
true
end
where( auth_hash_extended ).first_or_create do |user|
user.provider = auth.provider
#blablabla
end
Si tiene dificultades para separar el hash en conjuntos de valores clave, puede usar esta forma.
Reemplace su buscador actual:
def self.from_omniauth(auth)
where(provider: auth.provider, uid: auth.uid).first_or_create do |user|
user.provider = auth.provider
user.uid = auth.uid
user.name = auth.info.name
user.save
end
end