Usando llamadas API service-to-service con oAuth2.0 desde AL - Business Central

Breaking

lunes, 15 de enero de 2024

Usando llamadas API service-to-service con oAuth2.0 desde AL

En ocasiones necesitamos conectar desde Business Central, con otro Business Central.  El lenguaje AL ofrece las herramientas necesarias para ejecutar las llamadas, por ejemplo con la codeunit oAuth2:

    OAuth2: Codeunit Oauth2;


Preparar Business Central para aceptar llamadas


La primera tarea que debemos de hacer es preparar Business Central para que sea capaz de aceptar llamadas externas.  

Hace algunas versiones, se eliminó la posibilidad de utilizar la autenticación API KEY o Web Key en Business Central, por lo que ahora debemos de usar la autenticación oAuth2.0.

En este video de mi canal, podrás ver como configurar en Azure para que podamos recibir esas llamadas:



También en este post os decía como usar la autenticación oAuth20 desde AL pero con la intervención de una persona que nos suministre el consentimiento.



Llamando a otro Business Central: Máquina - Máquina


En este caso, vamos a conectar entre dos Business Central, pero con "Client credentials".  Es decir, que solicitamos el token de acceso mediante una serie de parametros como son:


¿de donde sacamos estos parámetros? Los tenemos en el portal de Azure, donde hemos autorizado la aplicación:


Si quieres conocer más acerca de como configurar el portal de Azure para permitir el acceso, lo puedes encontrar aquí:


Para poder acceder a Business Central, necesitamos un token, que nos generará en cada momento lo cual otorga mayor seguridad a las comunicaciones.

Utilizando la codeunit oauth2 y su función AcquireTokenWithClientCredentials

            OAuth2.AcquireTokenWithClientCredentials(
                    ClientId,
                    ClientSecret,
                    OAuthAuthorityUrl,
                    RedirectURL,
                    Scopes,
                    AccessToken);

A la que le pasaremos los parametros necesarios:

ClientId : Es el identificador de la App que nos suministra el portal de Azure
ClientSecret: Es la clave secreta que generamos desde el portal de Azure en "Certificados y Secretos"
OAuthAuthorityUrl:  Será la URL que permitirá generar el token.  En el caso de Business Central será:

  https://login.microsoftonline.com/{Tenant}/oauth2/v2.0/token

Donde {Tenant} será el tenant donde está alojado el Business Central al que conectaremos.

RedirectURL: Es un parametro opcional, pero en Business Central podemos poner

    https://businesscentral.dynamics.com/OAuthLanding.htm

Scopes: Corresponde al ámbito de uso de la aplicación.  En nuestro caso será:

    https://api.businesscentral.dynamics.com/.default

AccessToken: Es una variable donde se guardará el token generado.

Como usar el token obtenido.


En el siguiente trozo de código te muestro como usar el token para solicitar las ofertas de venta, usando la API estandard de Business Central:

procedure GetSalesQuotes(AccessToken: text) Result: Text
        var
        Client: HttpClient;
        Response: HttpResponseMessage;
        Url: Text;
    begin
        Client.DefaultRequestHeaders.Add('Authorization',
strsubstno('Bearer %1',AccessToken));
        Client.DefaultRequestHeaders.Add('Accept', 'application/json');
        Url := 'https://api.businesscentral.dynamics.com/v2.0/{{Tenant/Environment}}/api/
                            v2.0/companies({{CompanyID}})/salesQuotes'
        Client.Get(Url, Response);
           
        if not Response.IsSuccessStatusCode then
            Error('Solicitud de Business Central fallo\%1 %2',
                            Response.HttpStatusCode, Response.ReasonPhrase);
        Response.Content.ReadAs(Result);
    end;

En la variable Result, tendremos un JSON con las ofertas de venta que tengamos en nuestro sistema.



Con este frágmento de código, podemos hacer llamadas a cualquier API de Business Central, siempre y cuando tengamos permisos.

Os dejo un video para que lo podáis ver en funcionamiento:




Espero que os sirva. 



Si te ha parecido interesante, puedes invitarme a un café 😇

Gracias

No hay comentarios: