La compañía para la que trabajo mantiene un exitoso producto SaaS que creció "orgánicamente" con los años. Estamos planeando expandir la línea con un conjunto de nuevos productos que compartirán datos con el producto existente. Para respaldar esto, buscamos consolidar la lógica empresarial en un solo lugar: una capa de servicio web. La capa WS será utilizada por:
- Las aplicaciones web
- Una herramienta para importar datos
- Una herramienta para integrarse con otro software de cliente (no una API per se)
También queremos crear una API que pueda ser utilizada por nuestros clientes que sean capaces de usarla para crear sus propias integraciones. Estamos luchando con la siguiente pregunta:
Si la API interna (también conocida como la capa WS) y la API externa son una en la misma, con configuraciones de seguridad y permisos para controlar lo que puede hacer quién, o deberían ser dos aplicaciones separadas donde la API externa solo llama a la API interna como cualquier otra aplicación? Hasta ahora en nuestro debate, parece que separarlos puede ser más seguro, pero agregará gastos generales.
¿Qué han hecho otros en una situación similar?
fuente
Respuestas:
Siempre es bueno comer tu propia comida para perros. Una API también debería ser más fácil de mantener que dos, incluso si considera algunos gastos generales para la autenticación y la autorización.
fuente
Aunque estoy de acuerdo con Aneurysm9, a veces no desea exponer todas las capacidades de su sistema. En este caso, sería preferible tener dos API ... PERO si lo elige de esta manera ... asegúrese de que todas las funcionalidades comunes compartan la misma API, es decir, una sea una versión extendida de la otra en lugar de dos distintas Conjuntos de código.
De esta manera, puedes usar el tuyo para ti mismo mientras tienes un lugar para que el trabajo privado, sensible y experimental progrese mientras te permite publicar y usar las nuevas cosas sin cambiar demasiado la API pública.
fuente
He encontrado esto antes (muchas veces) y lo que terminé haciendo preferir es:
Saque el BL del sitio web. Convierta el sitio web en un consumidor de la API. Trate el sitio web como un cliente más de su API. Tu API ES el servicio.
Si te encuentras pensando que necesitas métodos API especiales solo para el sitio web, ¡piénsalo de nuevo! Si es bueno para el ganso, es bueno para el ganso. Si realmente realmente necesita una funcionalidad especial para el sitio web, sugeriría que lo que realmente ha encontrado es una diferencia en el "perfil de usuario" y, por lo tanto, esta es una situación en la que la API aún debe admitir las funciones "especiales", pero entonces usted controlarlos mediante autorización.
¿No convencido?
Lleva el paradigma un paso más allá ...
La aplicación del teléfono se ejecuta en una plataforma donde se ejecuta el código de bytes, la aplicación vive en el teléfono y consume servicios API a través de HTTP / JSON
El sitio web es una aplicación que se ejecuta en una plataforma donde se ejecuta HTML + Javascript, la aplicación vive en un navegador y consume servicios API a través de HTTP / JSON
¡Misma misma!
Extiéndalo a tabletas, televisores, otras plataformas telefónicas, complementos, aplicaciones de terceros, mashups, ...
Muchas experiencias de usuario diferentes, todas conectadas a una API común.
Tu aplicación es la API. El sitio web es solo un cliente (de muchos)
fuente
Use una API
Si está implementando la API de servicio como una capa REST, simplemente agregue autenticación a las rutas que están protegidas.
Probablemente querrás usar un marco de desarrollo que no cuente con demasiada 'magia'. Algo donde puede definir rutas directamente sin mucha ingeniería inversa.
Piensa en algo como Node.js / Express, python / pylons, python / google app engine, etc.
Recientemente implementé esto en Google App Engine para una API REST / Datastore y no creo que pudiera haber sido más fácil. Los controladores se implementan como clases y sus solicitudes HTTP posteriores (es decir, GET / POST / PUT / DELETE) se implementan como métodos de esas clases. Logré implementar basic-auth como decorador. Eso hizo que agregar un requisito de autenticación a una solicitud fuera tan simple como adjuntar el decorador @basicAuth.
De esa forma, podría hacer públicas las solicitudes GET entrantes, agregar un requisito de autenticación a las solicitudes POST / PUT / DELETE en el mismo controlador para ese modelo.
Si sabe cómo hablar en REST, la vida se vuelve mucho más fácil porque el soporte REST ya está inherentemente integrado en cada servidor web (es decir, HTTP es solo un tipo de API REST). Incluso puede optar por la compresión gzip transparente si está enviando una gran cantidad de datos a través del cable.
fuente
Mi primera impresión es que debería ser la misma API y que su seguridad debería estar en una capa completamente diferente. ¿Quizás manejado por un frente web?
fuente