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.
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.
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.
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.
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:
Profesional con experiencia en el desarrollo de software, proyectos web y proyectos de business Intelligence y big data.
Fundador y autor en DataManagement.es donde he escrito artículos como:
- El modelo de estrella. El pilar fundamental del Business Intelligence
- Automatización de procesos con Pentaho
- Proceso ETL con python desde cero y paso a paso
- web scraping de empresas con python y powerbi
Deportista de alto nivel desde los 15 años, hago atletismo y mi especialidad es el medio fondo con marcas:
- 1000: 2.42
- 1500: 4.10
- 3000: 8.58
- 5000: 15.44
- 10000: 32.53
Del deporte he aprendido que con esfuerzo se puede conseguir grandes cosas.
Si mi perfil te es interesante, no dudes en contactar conmigo.
fran@datamanagement.es
Francisco Rodriguez Alfaro