2010-07-21 18 views
15

Estoy queriendo hacer una API rápidamente, siguiendo los principios de REST - para una aplicación web simple que he creado. El primer lugar donde se usará la API es interactuar con una aplicación de iPhone. La API solo necesita manejar algunas llamadas básicas, pero todas requieren autenticación, nada es información pública.Creando una apk RESTful simple

  • de usuario/autenticación de usuario
  • lista get de los registros en el grupo de usuarios
  • lista get nuevo, sólo aquellos que han cambiado (recién añadida o actualizada)
  • registro de actualización

Así , siguiendo los principios REST, ¿configuraría el esquema uri ?:

  • mysite.com/api/auth POST (?)
  • mysite.com/api/users (GET)
  • mysite.com/api/update POST (?)

y las respuestas será en XML para empezar, JSON demasiado tarde.

  1. En el sitio web, los usuarios inician sesión con correo electrónico y contraseña. ¿Debo permitirles obtener un 'token' en su página de perfil para aprobar con cada solicitud de API? (Haría que el recurso URI autónomo '/ auth' sea redundante).

  2. ¿Mejores prácticas para estructurar la respuesta xml? Parece que con el descanso, que debe devolver, ya sea 200 bien y el XML o códigos reales de estado adecuadas es decir, 401, etc

Cualquier punteros generales apreciados.

Respuesta

4

1- para la autenticación, es posible que desee considerar algo como http-básica, o digerir autenticación (nota - básica en particular es inseguro si no es a través de HTTPS)

para el esquema de direcciones URL:

  • /api/auth no es necesario si aprovecha básico o resumen.
  • /api/group/groupname/es probablemente más canónico
  • /api/update generalmente se haría como/api/users/username (POST) con los nuevos datos agregados - el recurso es el usuario - POST es el verbo
  • de lo contrario, básicamente su API parece sensata, mucho depende de si los grupos son jerárquicos y los usuarios deben vivir en un grupo; si es así, sus direcciones URL deberían reflejar eso y ser navegables.

2- Los códigos de estado deben reflejar el estado - 200 para OK, 401 para acceso denegado, 404 para no encontrado, 500 para procesamiento de errores. En general, solo debe devolver un registro XML si tiene una buena solicitud

+0

Derecha: realizar la autenticación de aplicación web tradicional crea un estado que no es reparador. OP querrá aprovechar HTTP auth, o algún otro esquema, que no requiera que el cliente retenga las cookies, etc. – timdev

+0

500 no se debe utilizar para la mayoría de los errores del lado del cliente. Es decir. si el error es detectable, debería haber alguna manera de informar al cliente al respecto. –

+1

@georgemarian es perfectamente razonable devolver un objeto de error XML, o alguna descripción maliciosa con código de estado 500. Sin embargo, es un indicador útil de que hubo algún error (por ejemplo, solicitud mal formada) en lugar de "no devolvió ningún registro" – jayshao

0

Por lo general, está en el camino correcto. El esquema URI debe basarse en la idea de recursos y debe usar un método apropiado para hacer el trabajo.

Por lo tanto, GET para recuperar información. POST (O tal vez PUT) para crear/cambiar recursos. BORRAR bien, eliminar. Y HEAD para verificar los metadatos.

La estructura de su XML no tiene mucho que ver con una API RESTful, suponiendo que no requiera administración de estado. Dicho eso, tienes la idea correcta. Si es una buena solicitud, devuelva el XML deseado (para una solicitud GET) y el código de estado 200. Si es una solicitud incorrecta, también puede, y en algunos casos debe hacerlo, devolver algo que no sea solo el código de estado. Básicamente, familiarícese con las especificaciones de HTTP y sígalas lo más cerca posible.

1

La autenticación en una API siempre funciona enviando algún token de autenticación en el encabezado de la solicitud. Es decir, incluso si usa el método de inicio de sesión /auth por separado, devolvería un token, posiblemente una cookie, al usuario, que debería enviarse junto con cada solicitud.

HTTP ya proporciona un header dedicado para este fin, aunque: Authorization.
La más básica HTTP "Autorización" es HTTP Basic access authentication:

Authorization : Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== 

Digest Authentication es otra, más seguro, el esquema. Sin embargo, puede usar este campo de encabezado para cualquier forma de autenticación que desee, incluso su autenticación personalizada implementada.

Authorization : MyCustomAuthentication foo:bar:n293f82jn398n9r 

Puede enviar el token de inicio de sesión antes mencionado en este campo. O bien, podría emplear un esquema de firma de solicitudes, en el que ciertos campos de solicitud se procesan junto con la contraseña del usuario, básicamente enviando la contraseña sin enviar la contraseña (similar a la autenticación resumida, pero puede usar algo mejor que md5). Eso borra el paso de inicio de sesión por separado. AWS employs this method.

Para una API en general, haga un buen uso de HTTP status codes para indicar lo que está sucediendo.

+0

Gracias, las contraseñas de usuario están actualmente almacenadas en MySQL y SHA1 encriptadas. Estoy ansioso por probar el esquema de firma, pero estoy teniendo problemas para entender completamente cómo hacerlo. más lectura, supongo ... POST mysite.com/user/user? name = mikey & – gio

+0

los esquemas de autenticación entran como encabezados http – jayshao

+0

@gio Intente seguir la documentación vinculada de AWS. La idea básica es que hash el contenido de tu solicitud junto con una clave secreta. El blob resultante es único para cada solicitud y no revela nada sobre la contraseña/clave. El servidor hará lo mismo, clasifique el contenido de su solicitud junto con su clave secreta (que conoce) y compare el resultado con lo que ha enviado. Solo si tiene la clave secreta correcta, puede crear la firma correcta para la solicitud. Es simple, pero efectivo. – deceze

Cuestiones relacionadas