Creando una aplicación en Python con SAP BTP foundry (Parte 1)

Hoy volvemos a lo esencial del blog, ¡a programar!

En esta entrada aprenderemos a crear una aplicación con e lenguaje Python que nos permita generar una APIRest mediante eventos de escucha de peticiones y posteriormente añadiremos seguridad en la aplicación a fin de que no se pueda ejecutar por terceros.

Una de las grandes ventajas que tiene utilizar la plataforma Cloud foundry es la diversidad de lenguajes que podemos utilizar para realizar «lo mismo». Y si, digo lo mismo entre comillas porque son varios los a factores que deberían influir en cuanto a la toma de decisiones de que tecnología utilizamos. Si os parece buena idea, puedo hacer una entrada sobre el tema, ya que a diferencia de lo que piensa mucha gente, la decisión no es solo el coste de la infraestructura (que también).

Vamos a la materia de hoy, como en todos los post de programar que hago se necesita una cuenta BTP trial. En este caso no necesitaremos nada más.

*antes de empezar os quiero comentar que este articulo sale de la guia oficial de SAP donde he detectado un error que he notificado a SAP para su corrección https://help.sap.com/viewer/65de2977205c403bbc107264b8eccf4b/Cloud/en-US/5534ef91043a47668f2518643b06f4a5.html

Creando una aplicación en Python

Creando el entorno inicial

Para crear nuestra aplicación en python que posteriormente desplegaremos en nuestra subaccount BTP Foundry vamos a acceder a nuestro Business Aplication Studio.

Esta vez no utilizaremos ninguna template, así que lo haremos directamente creando una carpeta llamada «python-tutorial» en la raíz de proyectos de BAS «Projects» con botón derecho y «create folder».

Una vez creada la nueva carpeta, añadiremos un fichero llamado «requirements.txt», este fichero sirve para añadir las librerías que requiere nuestro código provenientes de la página https://pypi.org/.

Este sera su contenido, donde añadiremos las librerías para añadir la seguridad, obtener las variables del contenedor y una librería para organizar nuestro proyecto.

Lo siguiente sera añadir un fichero llamado «runtime.txt» que nos permite indicar la versión de Python que utilizará nuestro código

Como en todos los contenedores que creamos en Foundry, necesitamos añadir un fichero de definición del contenedor para ayudar en su despliegue y arranque. El fichero se llamará manifest.yml y tendrá el siguiente código:

---
applications:
- name: myapp
  host: myTextEcgTest // or random-route: true
  path: .
  memory: 128M
  command: python server.py

Donde indicaremos el nombre de la aplicación, el Host (esto se puede substituir por «random-route»), el path donde tenemos la aplicación, la memoria y el comando de inicio donde indicaremos que queremos ejecutar Python y el fichero que crearemos en el próximo punto.

Añadiendo la aplicación en Python

Creamos un fichero llamado «server.py» que nos permitirá arrancar el servicio, añadir un puerto de escucha y en caso de acceder a la aplicación, nos devolverá «Hello World»:

import os
from cfenv import AppEnv
from flask import Flask
from flask import request
from flask import abort

from sap import xssec

app = Flask(__name__)

print("Hello server")

port = int(os.environ.get('PORT', 3000))
@app.route('/')
def hello():
    return "Hello World"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=port)

Ya tenemos todo apunto. Vamos a deployar la aplicación a nuestra subcuenta mediante el comando CF push (de momento no utilizaremos el despliegue usando mtar).

En caso de fallo, acordaros de hacer primero le login mediante CF login 😉

Una vez deployado, veremos que ya tenemos la aplicación apunto, si pulsamos sobre la ruta de la aplicación podemos acceder al servicio:

Este es el resultado:

Añadiendo seguridad

Con la aplicación anterior, ya podemos ejecutar nuestros servicios via API, pero en una aplicación productiva necesitaremos securizar el servicio casi con toda probavilidad.

El primer paso, como en todas las aplicaciones de SAP BTP foundry, es añadir el fichero que define la seguridad en el servicio XSUAA. Para esto, añadiremos un fichero llamado «xs-security.json» con el siguiente contenido:

{
  "xsappname" : "myapp",
   "tenant-mode" : "dedicated"
}

Una vez credo el fichero, ejecutaremos el comando de CF para crear un nuevo servicio XSUAA que posteriormente enlazaremos con la aplicación:

cf create-service xsuaa application myuaa -c xs-security.json

Una vez finalizado ya tenemos el servicio apunto para que pueda manejar la seguridad:

Ahora modificaremos el fichero de definición de la aplicación «manifest.yml» para hacer el binding:

---
applications:
- name: myapp
  host: myTextEcgTest
  path: .
  memory: 128M
  command: python server.py
  services:
    - myuaa

Ya solo nos queda validar el acceso cuando el usuario realiza la petición así que añadiremos el siguiente código de validación de acceso en el fichero «server.py»

import os
from cfenv import AppEnv
from flask import Flask
from flask import request
from flask import abort

from sap import xssec

app = Flask(__name__)
env = AppEnv()
uaa_service = env.get_service(name='myuaa').credentials

print("Hello server")

port = int(os.environ.get('PORT', 3000))
@app.route('/')
def hello():

    if 'authorization' not in request.headers:
        abort(403)
    access_token = request.headers.get('authorization')[7:]
    security_context = xssec.create_security_context(access_token, uaa_service)
    isAuthorized = security_context.check_scope('openid')
    if not isAuthorized:
        abort(403)

    return "Hello World"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=port)

Ya tenemos todo apunto, volvemos a deployar la aplicación mediante «CF push» y probamos, vemos que ahora nuestra aplicación es mas segura:

Añadiendo un appRouter para probar nuestra aplicación:

Para poder probar nuestra aplicación tenemos dos opciones. Una es mediante Postman o Curl solicitando un token y ejecutando el servicio o creando una aplicación de prueba que utilize un app router. En este caso, crearemos la aplicación.

El primer paso es crear una carpeta nueva dentro de la aplicación llamado «web».

Accedemos a la nueva carpeta des de la terminal y ejecutamos wizard para añadir las dependencias NPM con la instrucción «npm init».

Como nombre del proyecto pondremos «myapp», el resto de campos los podemos dejar como estan por defecto. Una vez finalizado el wizard tendremos un nuevo fichero llamado «package.json».

Ha llegado el momento de añadir las dependencias del app router, en el terminal ejecutamos este comando:

npm install @sap/approuter --save

Una vez instaladas las depenrencias del approuter, modificaremos el fichero «package.json» y añadiremos el siguiente script:

"start": "node node_modules/@sap/approuter/approuter.js"

Ahora crearemos una nueva carpeta llamada «resources» y dentro un fichero llamado «index.html» con el siguiente código

<html>
  <head>
    <title>Python Tutorial</title>
  </head>
  <body>
    <h1>Python Tutorial</h1>
    <a href="/myapp/">myapp</a>
  </body>
</html>

Como veis, hemos añadido un link hacia la aplicación myapp, pero para que esto funcione, deberemos indicarle al approuter el routing que debe hacer. Añadimos en la carpeta «web» un fichero llamado «xs-app.json» con el siguiente routing:

{
  "routes": [
    {
      "source": "^/myapp/(.*)$",
      "target": "$1",
      "destination": "myapp"
    }
  ]
}

Y por último, añadiremos la aplicación en el fichero de definición de la aplicación «manifest.yml».

---
applications:
- name: myapp
  host: myTextEcgTest
  path: .
  memory: 128M
  command: python server.py
  services:
    - myuaa
- name: web
  host: myTextEcgTestWeb
  path: web
  memory: 128M
  env:
    destinations: >
      [
        {
          "name":"myapp",
          "url":"https://myTextEcgTest.cfapps.eu10.hana.ondemand.com",
          "forwardAuthToken": true
        }
      ]
  services:
    - myuaa

Donde el host sera la URL del servició python que podemos extraer del cockpit, como podemos ver en el apartado anterior, cuando hemos probado la aplicación sin seguridad.

Volvemos a subir la aplicación mediante el comando CF push. Una vez arrancadas las aplicaciones buscaremos en el cockpit la aplicación y su URL:

Y ejecutaremos la url de la aplicación «web» para acceder a la aplicación:

Al acceder a la aplicación nos aparecerá la pantalla de login:

Una vez informada, accederemos a la aplicación:

Si accedemos a nuestra aplicación en Python, veremos que ahora no nos aparece el mensaje de error de credenciales:


Como veis, es bastante fácil utilizar Python y crear APIS para interactuar con este lenguaje. Otra opción más que añadiremos a nuestra lista ;).

Como siempre suscribete, dale a la campanita de notificaciones y comparte en redes para estar a la última.

Una respuesta a «Creando una aplicación en Python con SAP BTP foundry (Parte 1)»

Deja una respuesta

Tu dirección de correo electrónico no será publicada.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.