ios - por - inicio de sesión no seguro bloqueado facebook
API Rails: autentica usuarios de aplicaciones móviles nativas usando nombre de usuario/contraseña o token de Facebook (1)
Así que he estado tirando de mis pelos durante unos días tratando de descubrir cómo agregar la autenticación de nombre de usuario / contraseña a mi API de Rails Mobile.
Aquí hay una breve descripción de mi flujo de autenticación actual:
El usuario selecciona "iniciar sesión con Facebook" en el cliente móvil, el cliente redirige a la aplicación de Facebook y solicita access_token
En caso de éxito, Facebook responde con el token de acceso y el cliente redirige a mi aplicación.
El cliente envía el token de acceso a mi API
Mi API usa la gema de koala para comprobar si el token de acceso es válido.
Si el token es válido, Facebook envía los datos de los usuarios a la API donde se crea un nuevo usuario. Si el usuario ya existe, mi API envía los datos de los usuarios.
Mi API maneja el token de acceso en el paso 4 como se muestra a continuación:
def self.authenticate_user_from_facebook(fb_access_token)
user = User.new
graph = Koala::Facebook::API.new(fb_access_token)
profile = graph.get_object(''me'')
#user[''fb_id''] = profile[''id'']
#user[''fb_token''] = fb_access_token
# Generate user hash
uhash = Hash.new
uhash[''provider''] = ''facebook''
uhash[''uid''] = profile[''id'']
uhash[''info''] = Hash.new
uhash[''info''][''nickname''] = profile[''username'']
uhash[''info''][''name''] = profile[''name'']
uhash[''info''][''email''] = profile[''email'']
uhash[''info''][''first_name''] = profile[''first_name'']
uhash[''info''][''last_name''] = profile[''last_name'']
uhash[''info''][''verified''] = profile[''verified'']
uhash[''info''][''urls''] = Hash.new
uhash[''info''][''urls''][''Facebook''] = profile[''link'']
uhash[''credentials''] = Hash.new
uhash[''credentials''][''token''] = fb_access_token
uhash[''extra''] = Hash.new
uhash[''extra''][''raw_info''] = Hash.new
#Save the new data
user = User.apply_auth(uhash)
return user
end
def self.apply_auth(uhash)
User.where(:uid => uhash[''uid''], :provider => uhash[''provider'']).first_or_create do |user|
user.provider = uhash[''provider'']
user.uid = uhash[''uid'']
user.nickname = uhash[''info''][''nickname'']
user.email = uhash[''info''][''email'']
user.name = uhash[''info''][''name'']
user.first_name = uhash[''info''][''first_name'']
user.last_name = uhash[''info''][''last_name'']
end
end
Una vez que se crea el usuario, pueden realizar solicitudes a mi API usando su token de acceso como se muestra a continuación:
En el paso 2, la API está utilizando koala para verificar el token de acceso de los usuarios. Esto se hace aplicando el siguiente before_filter a todos los controladores.
before_filter :current_user
y en mi application_helper.rb
def current_user
@current_user ||= User.authenticate_user_from_facebook(params[:access_token])
end
Cada vez que un usuario realiza una solicitud a mi API, la gema de koala se usa para verificar si el token es válido, luego se procesa la solicitud.
Lo que intento agregar ahora es la autenticación con solo nombre de usuario y contraseña.
Cosas que he estudiado
Me he estado refiriendo constantemente a Railscast 235, 209, 250, 82 y leyendo en OAuth2. Tengo una comprensión básica de cómo funciona la autenticación pero tengo problemas para aplicarla a mi flujo de autenticación actual.
Diseñar autenticación de tokens en referencia a Railscast 235, 209, y esta publicación en el blog: http://matteomelani.wordpress.com/2011/10/17/authentication-for-mobile-devices/
Puedo entender cómo iniciar sesión y validar a un usuario que inicia sesión con un nombre de usuario y contraseña. Sin embargo, estoy confundido en cuanto a cómo se combinará con mi flujo de inicio de sesión de Facebook. No entiendo cómo crear una sesión con un dispositivo para un usuario que ya tiene un token de acceso generado por Facebook.
OAuth2 Al hacer que mi API sea un proveedor de OAuth2, parece que sería una buena forma de hacerlo, pero parece una tontería redirigir a un navegador, y no sé si es posible redireccionar desde el navegador a mi aplicación.
Autenticación desde cero Esta es la opción con la que estoy pensando, pero estaría reinventando la rueda.
¡Gracias por leer esta larga publicación! ¡Cualquier consejo es apreciado!
Es posible que desee ver a Warden . Warden hace que sea fácil configurar y usar diferentes estrategias de autenticación, ya sea que uses tokens, contraseña o Facebook. Está basado en Rack, por lo que también funciona fuera de Rails, lo que es bueno si alguna vez quieres usar algo como Grape para la API.
Aquí está RailsCast on Warden . (Requiere suscripción Pro)