Token de portador a punto de caducar de la API: compruebe si ha caducado.

Un usuario Pregunto ✅

AUaero

Hola,

Tengo una función que solicita un token de portador de una API segura. El token caduca una semana después de su emisión. Me gustaría poder guardar el token en una tabla y solo actualizar la tabla si el token ha caducado. Aquí está mi función:

let
    Source = () => let
        url = "https://www.foobar.com/token",
        un = "foo@bar",
        pw = "password123",
        body = "grant_type=password&userName=" & un & "&password=" & pw,
        GetJson = Web.Contents(
            url,
            [
                Headers = [
                    #"Content-Type" = "application/x-www-form-urlencoded"
                ],
                Content = Text.ToBinary(body)
            ]
        ),
        FormatAsJson = Json.Document(GetJson)
    in
        FormatAsJson
in
    Source

La función devuelve lo siguiente en Power Query:

Snipaste_2020-08-24_15-33-42.jpg

Entonces, aquí está la pregunta: ¿hay alguna forma de solicitar un token solo si la fecha actual es posterior a la fecha de vencimiento del token?

¡Gracias!

lbendlin

No puede almacenar la fecha de vencimiento en Power Query. Simplemente no tiene memoria. Sin embargo, lo que puede hacer es escribirlo en una tabla de base de datos del servidor SQL (o cualquier otro entorno de base de datos) a través de la mítica función NativeQuery.

https://docs.microsoft.com/en-us/powerquery-m/value-nativequery

Y luego podría recuperar ese punto de datos como parte de su proceso habitual.

Hay algunos ejemplos aquí en el foro de personas que abusan de esa función para todo tipo de procesos ETL complejos. Muy entretenido, muy cuestionable.

Otra alternativa sería ignorar la fecha de caducidad y simplemente solicitar un nuevo token de todos modos.

lbendlin

No puede almacenar la fecha de vencimiento en Power Query. Simplemente no tiene memoria. Sin embargo, lo que puede hacer es escribirlo en una tabla de base de datos del servidor SQL (o cualquier otro entorno de base de datos) a través de la mítica función NativeQuery.

https://docs.microsoft.com/en-us/powerquery-m/value-nativequery

Y luego podría recuperar ese punto de datos como parte de su proceso regular.

Hay algunos ejemplos aquí en el foro de personas que abusan de esa función para todo tipo de procesos ETL complejos. Muy entretenido, muy cuestionable.

Otra alternativa sería ignorar la fecha de caducidad y simplemente solicitar un nuevo token de todos modos.

AUaero

En respuesta a lbendlin

Todavía estoy aprendiendo M, por lo que la funcionalidad de NativeQuery es nueva para mí. Acabas de abrir la puerta a todo tipo de prácticas cuestionables. 🤣

Entonces, la razón por la que estoy tratando de resolver esto es esta: escribí el script para solicitar el token como una función para poder llamarlo desde mis otras consultas cuando llego a un punto final de API, como:

let
    AccessToken = GetToken,
    url = "https://www.foobar.com/api/order",
    GetJson = Json.Document(
        Web.Contents(
            url, 
            [   
                Headers = 
                [
                    Authorization=AccessToken, 
                    #"Content-Type"="application/json; charset=utf-8"
                ]
            ]
        )
    ),
    ToTable = Table.FromList(GetJson, Splitter.SplitByNothing(), null, null, ExtraValues.Error),
    Expand = Table.ExpandRecordColumn(ToTable, "Column1", Record.FieldNames(ToTable{0}[Column1]))    
in
    Expand

La única razón por la que lo tengo como una función es porque si solo tengo la solicitud de token como una consulta, Power Query se queja con el error Formula.Firewall y me pide que reconstruya la combinación de datos. Por alguna razón, si es una función en lugar de una consulta, funciona bien.

Esto está bien excepto que tengo que tocar el punto final cientos de veces para consultar información adicional. No quiero enviar spam a la API con solicitudes de token. ¿Alguna idea sobre cómo solucionar el problema de formula.firewall?

lbendlin

En respuesta a AUaero

El cortafuegos de fórmula está ahí exactamente por esa razón: para evitar que los datos se filtren entre las fuentes de datos. Es por eso que reutilizar el token en otras consultas es tan difícil.

En su función puede emular esa memorización del token de la forma que comentamos. Primero consulte la base de datos si hay un token presente con un tiempo de caducidad en el futuro. Si es así, sirva esa ficha. Si no, obtenga un nuevo token, guárdelo en la base de datos (a través de NativeQuery) y luego sírvalo.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *