D A T A M A N A G E M E N T

Cargando...

Introducción

Ya utilizas powerBI de costumbre para analizar tu negocio y te gustaría ir un paso más allá y compartir con los usuarios de negocio el mismo informe. 

La gente cae en el error de generar un IFrame qué es PÚBLICO en una página web qué es privada de la empresa. Esto es un error porque pulsando el F12 puedes obtener la URL del Iframe y además, todos los usuarios ven toda la información.

Negocio siempre quiere lo siguiente:

  • El usuario/cliente qué accede solo tiene qué poder ver la información qué le corresponde
  • Ningún usuario/cliente bajo ningún concepto debe poder ver la URL y/o modificar filtros para ver información de otros usuarios.

POWERBI TIENE SOLUCIÓN A ESTO y es POWERBI EMBEDDED 

Descripción

El objetivo de este manual es unificar y simplificar la creación de una aplicación de powerBI y su uso mediante la API Rest que ofrece Azure y powerBI Embedded.

Antes de empezar, hay que cumplir con los siguientes requisitos:

  • Tener un usuario de powerBI PRO
  • La autenticación del usuario debe ser simple, no puede ser autenticación de doble factor
  • Permiso para crear un área de trabajo dentro de PowerBI o permiso a un área de trabajo en modo administrador

Si eres un usuario nuevo que no está registrado en Azure deberías registrarte, para ello hazlo en este formulario. 

Crear Workspace en powerBI

Se necesita crear un Workspace obligatoriamente para poder utilizar el servicio de powerBI Embeded. No se puede utilizar “Mi área de trabajo”.

Desde dentro de la plataforma de powerBI hay que crear una nueva área de trabajo. Para este ejemplo he creado “PBI_Embed”.

Después de crear el área de trabajo, crear con powerBI Desktop un informe simple, sin datos que solo contenga un texto o título y publicarlo al área de trabajo creada.

Crear los permisos con la API de PowerBI

Una vez se tiene el área de trabajo y los informes con los datos que se quieren compartir, ahora hay que dar permisos a la API de powerBI en azure para poder usar PowerBI Embedded.

El resumen del formulario es el siguiente:

  • Login con el usuario de powerBI Pro que tiene permisos al workspace

  • Registrar la aplicación en Azure

Ya está disponible, ahora a crear una aplicación de ejemplo.

Creación aplicación WEB con .NET

Primero de todo hay que instalar Postman (facilita mucho el desarrollo y pruebas) y un editor de texto como puede ser NotePad++. Lo usaremos para probar la obtención del token de acceso etc…

Autenticación con Azure

La autenticación con azure es el primer paso para realizar. Con la autenticación de azure recibiremos un token con el que luego se usará para interactuar con la API Rest de PowerBI.

Los datos necesarios son:

  • grant_type:Password
  • resource:https://analysis.windows.net/powerbi/api
  • client_id: El cliente ID es el ID de la aplicación creada de powerBI en el paso anterior.
  • username: Correo electrónico con el que se hace login en el portal de azure
  • password: Contraseña del usuario
  • client_secret: Es una clave secreta que se debe generar en el portal de azure dentro de la aplicación creada
  • scope:Dataset.Read.All

client_id

Es el Id. De aplicación (cliente) que se encuentra dentro de la aplicación creada

Client_secret

Es la clave que hay que generar para poder hacer la autenticación con Azure. El valo lo muestra cuando generas el secreto y luego te lo oculta por lo que hay que anotárselo o crear  uno nuevo cuando se pierda el valor antiguo.

Obtención de la URL para Embeber el informe de powerBI con Postman

Después de la autenticación con azure y obtención del token ya podemos hacer uso de la API Rest de powerBI.

Para empezar, necesitamos los datos del workspace y del report

Después de obtener el token de azure y el ID del workspace y del reportID, se debe hacer una petición GET autenticándose con el token de azure y enviando en la URL los ID de workspace y de report

Clase en C# para automatizar la obtención del Token de azure y la obtención de la URL Embebida

Con la clase que he desarrollado, he implementado 2 métodos propios, uno para obtener el token y otro para obtener la URL para embeber. El objetivo es automatizar lo que se ha hecho con Postman. Se puede ver que los datos necesarios son:

  • groupID
  • reportID
  • client
  • user
  • password
  • key

Métodos de la clase PowerBI_API

El método Connect se autentica con la API de Azure para obtener el token.

El método GetEmbedURL obtiene la URL para embeber el informe en HTML con el SDK de powerBI para Javascript

Como resultado de lo anterior ya se tiene todos los datos necesarios para obtener el informe e incrustarlo.

Listo para usar el SDK Javascript de powerBI

<script type="text/javascript" language="javascript" src="https://code.jquery.com/jquery-1.12.4.js"></script> 
<script type="text/javascript" language="javascript" src="https://rawgit.com/Microsoft/PowerBI-JavaScript/master/dist/powerbi.min.js"></script> </script>

Ahora que ya tengo toda la información, hay que programar el front con javascript.

He desarrollado algo muy simple con el objetivo de poder interactuar con la librería de powerBI en jasvascript y aplicar filtros etc…

El código Javascript para hacer uso de la API de powerBI e incrustar en el HTML es el siguiente.

Con este código después de haber obtenido con C# los datos:

  • reportID
  • embedURL
  • token

Podemos usar la API con jasvascript y también con el enlace porque ya tenemos los 3 datos que solicitan:

La función cargarDashboardSimple() carga en un div HTML el Dashboard

Muy importante tener en cuenta que el tipo de Token es Aad y no Embed. Este tipo de Token lo que hace es utilizar el token obtenido con la autenticación de Azure. 

Al importar el cuadro de mandos veremos todos los datos.

Esta función elimina el panel de filtros del lado derecho del informe de powerBI

Esta función aplica un filtro en el informe pero este filtro se puede modificar desde el navegador web.

PROBLEMAS DE SEGURIDAD

El problema de incrustar un informe con todos los datos y luego filtrar los datos a través del SDK de powerBI es que cualquier “listillo” que tenga algo de conocimientos de javascript puede modificar la función del filtrado.

Ejemplo

Ejecutando la función “aplicarFiltro()” lo que hace es filtrar todo el informe por el usuario con el ID = 1. Esto es lo que quería. BIEN.

Luego, si redefino la función y modifico el ID del usuario podré ver otro usuario

Después de redefinir la función y ejecutar la función, ahora estoy visualizando los datos de los usuarios 3 y 4. ESTO NO PUEDE SER ASÍ

Solución a los problemas de seguridad

La solución pasa por obtener un Token de powerBI embebido.

La URL a utilizar es esta:

  • POST https://api.powerbi.com/v1.0/myorg/groups/{groupId}/reports/{reportId}/GenerateToken

Y se tiene que enviar el token de azure con la autenticación en el Header.

Después hay que construir un objeto JSON para enviar en el BODY

El Token que es obtiene es un token del tipo Embed y no del tipo Aad. Para utilizarlo con el SDK Javascript de powerBI es importante tener esto en cuenta.

Para usar esta autenticación, el informe que se construya en el Dashboard hay que crear un nuevo ROL 

Y una vez hecho lo anterior, con el token obtenido del tipo “Embed token” ya se puede consultar el report.

De esta forma no hay manera de violar la seguridad del reporte.

Código C# para automatizar la obtención del “Embed Token”

Primero de todo hay que definir las clases para poder construir el siguiente objeto

Y esto lo hacemos con el siguiente código

Con las clases anteriores al construir un objeto de la clase PBI_Body se puede serializar y obtener un objeto JSON como el que hay en la imagen de Postman.

Con el siguiente método que se ejecuta a través del controlador y es llamado con los parámetros:

  • Token: Es el token obtenido con el método “Connect”
  • groupID: Es el ID del workspace
  • reportID: Es el ID del Report (Dashboard)
  • datasetID: Es el ID del dataset, se puede ver este ID cuando vas a configurar un conjunto de datos
  • cod_usuario: Es el ID del usuario de workplace, por el que filtrará toda su información
  • role: Es el rol que va a aplicar en el informe de powerBI

El código del controlador es el siguiente.

Y el código de la vista es el siguiente. La vista necesita esta información:

  • _type = «report»; // Está HARDCODEADO
  • _tokenType = models.TokenType.Embed; // El tipo de token es Embed
  • _reportID = «@ViewBag.pbi_reportID»; // El reportID se obtiene del controlador
  • _embedURL = «@ViewBag.pbi_embedURL»; // el embedURL también se obtiene del controlador
  • _pbi_token_embed = «@ViewBag.pbi_token_embed»; // Y el token_embed se obtiene del controlador.

Ahora cuando ejecutamos el proyecto podemos observar lo siguiente:

Como se puede apreciar, solo se visualizan los datos del usuario 2 y ninguno más, ya no tenemos la posibilidad de filtrar por otro usuario ni modificando el javascript de la web y esto es gracias a que: 

  • Estamos ejecutando un ROL
  • Este ROL está filtrando los datos por el usuario que ha hecho login
  • Nos hemos autenticado con la API de powerBI con el usuario 2 forzosamente
  • Y cuando hemos obtenido el token de ese usuario solo vemos los datos de ese usuario.

Conclusión

He diseñado un único informe con todos los datos de todos los usuarios, he creado un rol para poder filtrar por usuario autenticado y para cada usuario que hace login en la web solo visualiza sus datos

Si se quiere desarrollar un configurador para que powerBI funcione en Producto los datos a guardar en BBDD para cada usuario debería ser los siguientes:

  • datasetID
  • groupID
  • reportID
  • clientID
  • user
  • password
  • key

Enlaces

Leave a Comment

Virgen del pilar nº4, ático H

03330 Crevillente (Alicante)