update tutorial signup registrationscontroller rails ruby-on-rails facebook strong-parameters omniauth-facebook

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