martes, 22 de septiembre de 2020

Transacciones Fiori

 

/UI2/CACHERegister service for UI2 cache use
/UI2/CACHE_DELDelete cache entries
/UI2/CHIPChip Registration
/UI2/CUSTCustomizing of UI Technologies
/UI2/FLCFiori Launchpad Checks
/UI2/FLIAFiori Launchpad Intent Analyis
/UI2/FLPSAP Fiori Launchpad
/UI2/FLP_CONTCHECKFiori Launchpad – Content Checks
/UI2/FLP_INTENTCHECKFiori Launchpad – Intent Checks
/UI2/FLPD_CONFFiori Launchpad Designer (cross-client)
/UI2/FLPD_CUSTFiori Launchpad Designer (client-specific)
/UI2/GW_ACTIVATEGateway – Activation
/UI2/GW_APPS_LOGGateway – Application Log
/UI2/GW_ERR_LOGGateway – Error Log
/UI2/GW_MAINT_SRVGateway – Service Maintenance
/UI2/GW_SYS_ALIASGateway – Manage SAP System Alias
/UI2/NAVRegister navigation objects
/UI2/NAVPROVDefine navigation provider
/UI2/NWBCStart UI2 NWBC
/UI2/NWBC_CFG_CUSTNWBC Configuration (Customer)
/UI2/NWBC_CFG_P_CUSTNWBC Config: Define Parameter (Cust)
/UI2/NWBC_CFG_P_SAPNWBC Config: Define Parameter (SAP)
/UI2/NWBC_CFG_SAPNWBC Configuration (SAP)
/UI2/PERS_DELCleanup Personalisatation Service
/UI2/POWLRegister POWL for OData consumption
/UI2/SEMOBJDefine Semantic Object – Customer
/UI2/SEMOBJ_SAPDefine Semantic Object – SAP

sábado, 22 de agosto de 2020

Obtención de token JwtBearer desde Azure AD, para el consumo de una API registrada como aplicación en Azure

Una manera de autenticar API's que están en la nube cuando se utiliza Azure como plataforma de nube es utilizar el Directorio activo como administrador de las identidades es posible pedirle a Azure AD que de un registro de una aplicación "no interactiva" nos pueda enviar un token que pueda ser enviado a la API que consumiremos misma que estará autenticada y autorizada en Azure AD.

Para ver el detalle de cómo hacer el registro de una API en Azure ver el siguiente post, el cual viene muy completo y sencillo, sin embargo, el tema de clientes para Xamarin y Blazor no lo menciona, que es justo lo que se anexa en este post: 

https://dotnetplaybook.com/secure-a-net-core-api-using-bearer-authentication/

 

Una vez habiendo hecho el registro de la API y del cliente de esa API y habiendo publicado la API es momento de consumirla y para ello nos puede ser útil los siguientes métodos. El primero aplica para Xamarin y para Blazor Hybrid Mobile. Y el segundo para aplicaciones tanto Blazor, .NET Core y ASP.NET Core.


Método para obtener el token y un cliente http listo para invocar la API en Xamarin y Blazor Hybrid Mobile usando MSAL.NET.


private async Task < HttpClient > GetSecureClient()

{

     Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationResult              authresult = null;

     var auth = new AuthenticationContext(cfg.Authority); 

  authresult = await auth.AcquireTokenAsync(cfg.ResourceId, new Microsoft.IdentityModel.Clients.ActiveDirectory.ClientCredential(cfg.ClientId, cfg.ClientSecret)); 

  HttpClient cte = new HttpClient() {  BaseAddress = this.BaseAddress  }; 

  var defaultRequestHeaders = cte.DefaultRequestHeaders;

  if (defaultRequestHeaders.Accept == null || 

  !defaultRequestHeaders.Accept.Any(m =>m.MediaType == "application/json")) 

  { 

    cte.DefaultRequestHeaders.Accept.Add(new

     MediaTypeWithQualityHeaderValue("application/json")); 

  }

 

  defaultRequestHeaders.Authorization = 

  new AuthenticationHeaderValue("bearer", authresult.AccessToken);

 

  return cte; 

}


Método para obtener el token y un cliente http listo para invocar la API en .NET Core, ASP.NET Core Web API y Blazor usando Microsoft.Identity.Client.

private async Task<HttpClient> GetSecureClient()
        {
 
            IConfidentialClientApplication app = ConfidentialClientApplicationBuilder.Create(cfg.ClientId). 
                            WithClientSecret(cfg.ClientSecret). 
                            WithAuthority(new Uri(cfg.Authority)).Build();
 
            string[] ResourcesIds = new string[] { cfg.ResourceID }; 
            AuthenticationResult authresult = null;        
 
            authresult = await app.AcquireTokenForClient(ResourcesIds).ExecuteAsync();       
 
            HttpClient cte = new HttpClient() { BaseAddress = this.BaseAddress };
 
            var defaultRequestHeaders = cte.DefaultRequestHeaders; 
 
            if (defaultRequestHeaders.Accept == null || 
                !defaultRequestHeaders.Accept.Any(m => m.MediaType == "application/json"))
 
            { 
                cte.DefaultRequestHeaders.Accept.Add(new 
                    MediaTypeWithQualityHeaderValue("application/json")); 
            }
 
            defaultRequestHeaders.Authorization = 
                new AuthenticationHeaderValue("bearer", authresult.AccessToken);
 
            return cte;
 
        }

 


martes, 7 de abril de 2020

Búsqueda de elementos por tipo en JS, y asignación de manejadores de eventos


Usando el DOM especificamente la instruccion querySelectorAll, podemos sin necesidad de usar JQuery buscar los elementos de un tipo especifico y asignar manejadores de eventos a cada elemento de modo que se pueda escribir un código generico para manejar los algunos eventos en particular.

Ejemplo de búsqueda de radiobuttons en todo el documento html, para asegurarse de que solo hay 1 activado y al darle clic en cualquiera de los radio buttons.


//Búsqueda de todos los radio buttons para asociarles el evento click

       
       var radios= document.querySelectorAll('input[type="radio"]');
    radios.forEach(function(itm) {
            itm.onclick = function() {
                var rds = document.querySelectorAll('input[type="radio"]');

                rds.forEach(function(chk) {
                    chk.checked = false; //poner en check false a todos los radio buttons
                });

                this.checked = true; // habilitar el check del que recibio el clic

                //Colocar aquí código para acciones especificas de negocio o funcionalidades

            }        
    }

Transacciones Fiori

  /UI2/CACHE Register service for UI2 cache use /UI2/CACHE_DEL Delete cache entries /UI2/CHIP Chip Registration /UI2/CUST Customizing of UI ...