2012-04-12 9 views
8

estoy usando la versión 0.7.7 del Sorcery Authentication Gem por NoamB en mi Rails 3.2 AppHechicería Gem - user_info_mapping personalizada para los proveedores externos

Busco una posibilidad de cómo puedo conectar un método que está haciendo la información de asignación de usuario para un específico external login provider (e.g. facebook, twitter).

Por ejemplo, quiero cambiar la configuración regional proporcionada al formato que uso en mi base de datos o quiero descargar el avatar de usuario de twitter como parte del proceso de coincidencia.

Por defecto sólo es posible de esta manera sobre el archivo sorcery.rb:

config.facebook.user_info_mapping = {:email => "email", :first_name => "first_name", :last_name => "last_name" ... 

sé que puedo lograr tal comportamiento con los métodos setter en mi modelo de usuario, pero quiero mantener estas cosas se separan del modelo y Quiero poder definirlos específicamente para cada proveedor.

¿Esto es posible? / ¿Cuál es la mejor manera de implementar tales opciones de mapeo extendido?

Gracias por su ayuda!

Respuesta

0

Parece que puede hacer esto ampliando las diversas clases de proveedores de Sorcery para agregar los campos específicos de la aplicación que desee al hash de información de usuario.

Por ejemplo, para usar Twitter que podría tener algo como esto define:

config.external_providers = [:twitter] 

puede cambiar este nombre a:

config.external_providers = [:TwitterWithAvatar] 

Ahora es necesario definir el proveedor TwitterWithAvatar bajo Sorcery::Providers, y anula el método #get_user_hash:

module Sorcery 
    module Providers 
    class TwitterWithAvatar < Twitter 
     def get_user_hash(access_token) 
     user_hash = super 
     user_hash.merge(
      avatar: get_avatar(user_hash[:uid]), 
     ) 
     end 

     private 

     def get_avatar(uid) 
     # Some Twitter API call 
     end 
    end 
    end 
end 

Ahora usted puede configurar su asignación:

config.TwitterWithAvatar.user_info_mapping = {avatar: "avatar"} 

alternativa, puesto que ya está usando una clase de proveedor personalizado, puede mover su asignación en esa clase:

module Sorcery 
    module Providers 
    class TwitterWithAvatar < Twitter 
     def user_info_mapping 
     { 
      avatar: "avatar", 
      # ... 
     } 
     end 
    end 
    end 
end 

(yo no tengo intenté ejecutar este código, por lo que los detalles podrían estar un poco apagados, pero al leer el código fuente de Sorcery, esta parece la dirección correcta).

Cuestiones relacionadas