ios - una - no se pudo verificar la app iphone
Diseño para la autenticación de Facebook en una aplicación de iOS que también accede a un servicio web seguro (4)
Acabo de lidiar con esto yo mismo, y aquí está la parte que me mordió:
En su paso 5 ... Es posible que un usuario se registre en una cuenta con usted completamente separada de su ID de Facebook, ¿verdad? Luego, en otro momento, inician sesión con Facebook ... Y acaba de crear una segunda cuenta y perdió la primera.
Debe haber una forma de iniciar sesión en su servicio web, luego iniciar sesión en Facebook y capturar la asociación entre la ID de Facebook y la cuenta local.
Aparte de eso, su plan suena sólido.
Actualización : Facebook ha agregado un documento que describe un escenario de este tipo HERE
Objetivo: permitir que un usuario se autentique con Facebook en una aplicación de iOS que requiera acceso a un servicio web protegido que estoy ejecutando.
Supuestos: existe un sistema nativo de autenticación (y registro) para aquellos usuarios que optan por no usar Facebook para iniciar sesión.
Detalles:
- Supongamos que queremos ofrecer la opción para que un usuario inicie sesión con Facebook sin crear una cuenta / credencial separada para nuestro sistema.
- Debido a que admitimos nuestro propio mecanismo de autenticación nativo (nombre de usuario y contraseña), tenemos nuestros propios ID de usuario y emitimos un token de autenticación que se usa para las interacciones posteriores después de la validación de credencial inicial.
Me sorprende que Facebook no tenga las mejores prácticas para esto en su documentación de desarrollador. Toda la documentación existente asume que usted está creando la autenticación FB en un sitio web o una aplicación móvil independiente sin servicio que requiera autenticación.
Aquí están mis pensamientos iniciales sobre cómo se diseñaría esto, pero quiero validación sobre si es correcto.
- Cliente abre el inicio de sesión de Facebook iOS
- El usuario UI inicia sesión con las credenciales de Facebook y obtiene el token de acceso
- La aplicación iOS pasa el token de acceso a nuestro servidor
Nuestro servidor habla con la API del gráfico FB usando el token de acceso para (a) validar el token y (b) obtener el ID de usuario de FB para ese token de acceso.
Por ejemplo, nuestro servidor llamaría https://graph.facebook.com/me/?access_token=XYZ que devolvería información de perfil en un objeto JSON
Suponiendo que sea válido, nuestro servidor extrae la ID de usuario del objeto JSON y comprueba si el usuario ya tiene una cuenta. Si es así, emitimos nuestro propio ticket de autenticación para que el cliente lo use para esa sesión. Si el usuario no tiene una cuenta, creamos una nueva con el ID de usuario de Facebook, asignamos nuestro propio ID de usuario único y emitimos nuestro ticket de autenticación.
- Luego, el cliente devuelve el ticket de autenticación a las interacciones subsiguientes que necesitan autenticación.
Este parece ser el enfoque correcto para mí, pero no estoy seguro de si me estoy perdiendo algo increíblemente básico y me estoy yendo por el camino equivocado (complicado).
Su solución funciona totalmente.
Quizás una alternativa: ¿por qué no solo recibir el correo electrónico en el cliente desde la solicitud de servicio social inicial y enviarlo a su servicio web? El servicio web podría simplemente almacenar el correo electrónico, y tal vez también un proveedor social. Entiendo que su servicio web no podrá validar de dónde proviene el correo electrónico, pero ¿no existe una relación de alta confianza entre su servicio web y su cliente? Si lo hay, parece que puedes confiar en el correo electrónico que viene del lugar correcto. Alguien, por favor, hágame saber qué cosa obvia me falta, que hace que el enfoque basado en el correo electrónico sea tonto ...
Un problema que puedo ver con esta estrategia es que alguien puede darle un token de acceso obtenido para una aplicación de Facebook diferente. Por lo que sé, no hay forma de verificar que el token de acceso sea para su aplicación, por lo que solo podrá continuar y usarlo.
Aunque no suena muy perjudicial. En general, las personas / aplicaciones intentan proteger los tokens de acceso, en lugar de compartirlos.
Una posible ventaja de esto sería, para que alguien cree su propio sitio o aplicación móvil, obtenga tokens de acceso para sus usuarios e intente autenticarlos utilizando su API. Si esto tiene éxito (el usuario tiene una cuenta de Facebook en su sitio), el sitio malicioso podrá usar su API suplantando al usuario.
Es un poco largo, pero creo que podría funcionar.
Edición: Parece que hay una manera de validar el token de acceso después de todo. Vea la respuesta de @Daaniel en cuestión Obtenga el ID de la aplicación del token de acceso del usuario (o verifique la aplicación de origen para un token) .
Use https para transmitir el token de autenticación a su servidor, como lo indica Facebook
Intercambio de tokens de acceso
Nuestras políticas de datos prohíben explícitamente el uso compartido de un token de acceso para su aplicación con cualquier otra aplicación. Sin embargo, permitimos que los desarrolladores compartan Tokens entre una implementación nativa y una implementación de servidor de la misma Aplicación (es decir, utilizando la misma ID de la aplicación) siempre que la transferencia se realice mediante HTTPS.