2011-02-05 25 views
7

Estoy escribiendo una aplicación de back-end con API REST para iPhone y Android. Es una API interna.¿Cuál es la mejor manera de implementar una API REST de registro para iPhone/Android?

En este punto, estoy tratando de implementar una API de registro de usuario para que el usuario pueda registrarse desde la aplicación móvil.

Estoy escribiendo usando Django y con Django vienen con la falsificación de solicitudes entre sitios para la solicitud web. Tengo que desactivarlo para API REST, usando django-piston.

Entonces, ¿cómo puedo proteger mi API de registro de spam? ¿acelerador? captcha? ¿Cuál es la mejor práctica para implementar una API de registro? ¿Cuál es el peligro?

Una sugerencia surgió fue cargar una vista web en la aplicación móvil y tener un formulario de registro web móvil para poder implementar CSRF. Es una solución, pero no muy buena, ya que tengo que crear una página de diseño para cada dispositivo móvil o una genérica que podría no ser adecuada para todos los dispositivos.

Se agradecen muchas ayuda.

Saludos, Mickey

Respuesta

1

Estoy de acuerdo en que el uso de un proveedor de OpenID es una excelente manera de lograrlo. Debería mirar en http://pypi.python.org/pypi/django-social-auth o proyectos similares. Un beneficio adicional es que no necesita guardar credenciales de contraseña en su base de datos. Menos datos para administrar, menos datos para perder.

Si definitivamente necesita un esquema clásico de nombre de usuario/contraseña y el registro correspondiente (tal vez junto con cosas basadas en OpenID como SO en sí), me gustaría ir con la regulación que proporciona el pistón. Personalmente uso captchas solo como último recurso, y hacerlo a través de una interfaz REST es probablemente bastante molesto. ¿Solicita un captcha antes de que la fase de registro pueda continuar? ¿Cómo notas que este usuario ha completado el captcha (sesión + cookies, ...)? No puede usar reCAPTCHA o servicios similares sin utilizar una vista web (lo que haría que todo el enfoque de REST sea obsoleto).

Me volvería a visitar usando un WebView. Si mantiene su interfaz limpia y simple, no debería interferir con ninguna convención en ninguna plataforma de teléfono inteligente.

+0

solo por curiosidad, ¿cuál es el motivo por el cual no se puede usar el captcha? en el nivel de API REST? –

+3

Sin duda es posible, pero tendría que obtener la imagen del captcha a través de REST, mostrarla al usuario y luego obtener la respuesta en la próxima llamada. Creo que es algo para lo que una API no es ideal, ya que necesitas una sesión. No me gusta tener que mantener el estado entre llamadas API. Quizás solo soy yo. –

+0

De acuerdo con las llamadas a API sin estado (que es uno de los principios fundamentales de REST!). Sin embargo, si imprimiera su propia capcha, no hay ninguna razón por la cual no podría devolver un "token" (por ejemplo, un hash salado MD5 de la respuesta) junto con el URI de la imagen capcha. Luego, haga que su aplicación móvil verifique con la API enviando la respuesta de los usuarios junto con el hash original que se emitieron. –

0

No hay razón para preocuparse por CSRF para su API REST, marque esta section en la documentación que explica por qué.

La mejor manera de evitar el correo no deseado es recopilar datos de un origen verificado, como un proveedor de OpenID, Facebook, etc. Si desea hacerlo manualmente, la forma más sencilla de hacerlo es tomar django-registration y extender uno de los backends. Puede tomar el backend simple proporcionado y usar un formulario personalizado con un campo captcha. Esto debería ser suficiente para eliminar los registros automáticos. Debe ser lo suficientemente simple como para conectarlo con piston.

EDIT:

Tienes razón, acabo de volver a leer la pregunta y se dio cuenta que no menciona en absoluto el hecho de que ya se ha mencionado que está desarrollando su API REST contra los usuarios de Android/iPhone remotas. Por lo tanto, su API se expone públicamente y acepta solicitudes que no provienen de su dominio o de un cliente de navegador para ese asunto.

No volvería a reinventar la rueda en su caso, debe implementar Open API Authentication, ya que se adapta perfectamente a sus requisitos: sabiendo que está intercambiando información con un usuario real, sin preocuparse de dónde se originó la solicitud.

+0

kRON: creo que el CSRF solo se aplica al AJAX ¿verdad? Para API REST, tenemos que usar específicamente csrf_exempt(). Al menos, eso es lo que descubrí cuando intenté usar POST usando la API REST proporcionada por django-piston. –

+0

La pregunta es sobre el registro de un * nuevo * usuario ... Entonces el punto final del registro no se puede asegurar ... por lo que le preocupa que se abuse de él –

Cuestiones relacionadas