Arquitectura API interna y externa

19

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?

Drew Goodwin
fuente
Si compra un buen marco para SOA, todo este debate es discutible. ¿Planea rodar su propio marco SOA? ¿Por qué? Si es un producto exitoso, ¿por qué no licenciar JCAPS de Oracle? ¿O WebSphere de IBM? Entonces, la seguridad de la capa WS se vuelve omnipresente y transparente.
S.Lott
1
@ S.Lott Realmente no es tan difícil escribir una capa SOA. Ninguna de esas plataformas está basada en REST; Esto es 2012, ¿no? Eso suena horrible 'emprendedor'.
Evan Plaice
¿Por qué no tener una capa de servicio en la parte superior de su modelo de dominio? Entonces puede usar los mismos servicios internamente con su código fuente.
M.abuelezz

Respuestas:

13

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.

Aneurisma9
fuente
44
Me gusta cómo lo expresas. Tener dos capas separadas en última instancia significará cambiar las cosas en dos lugares muchas veces en el futuro, pruebas adicionales y mucha locura general tratando de descubrir por qué las cosas se desincronizaron. Si tuviera suficiente reputación para votar su respuesta, lo haría :)
Drew Goodwin
5

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.

Newtopian
fuente
3
Creo que estamos de acuerdo aquí. Use la capa de seguridad para restringir el superconjunto de funciones a los usuarios internos. De esa manera, tiene una API pero múltiples niveles de permisos para acceder a la API.
Aneurisma9
Estoy pensando en hacerlo yo mismo y manejarlo haciendo que mi aplicación sea un usuario de sí misma con privilegios elevados. Difícil de entender mi cerebro. Creo que necesito aplicar Hammock Driven Development en este caso.
AJB
4

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)

Jason Glover
fuente
Teniendo en cuenta que la API es la capa de aplicación completa, y las diversas versiones (SO, navegador, tableta, teléfono) son solo clientes de la API, ¡me llevaron a A-Ha! momento justo ahora.
AJB
2

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.

Evan Plaice
fuente
-1

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?

vegai
fuente
2
a veces las preocupaciones de seguridad profundizarán mucho más que el mero cifrado y la firma de transacciones. Como tal, es muy posible que algunos, o incluso muchos, elementos orientados a la seguridad se acumulen en su API principal. Dicho esto, estaría de acuerdo con usted en tratar de mantenerlo lo más separado posible.
Newtopian