Error de autenticación de token con paginación de fuente oData

Un usuario Pregunto ✅

jasonp76

Hola a todos,

He escrito una función (fnGetBearerToken) que devuelve un token de portador de la fuente oData usando algunos parámetros:

() as text =>
let
authKey = "{""ClientId"":""" & ClientId & """,""ClientSecret"":""" & ClientSecret & """}",
url = "https://trust.citrixworkspacesapi.net/" & TenantId & "/tokens/clients",
// Uses the Citrix Cloud POST oauth2/token method to obtain a bearer token
GetJson = Web.Contents(url,
    [
        Headers = [#"Accept"="application/json",
                #"Content-Type"="application/json"],
        Content = Text.ToBinary(authKey) 
    ]
),
FormatAsJson = Json.Document(GetJson),
// Gets token from the Json response
AccessToken = FormatAsJson[token]

in
    AccessToken

Esta función entonces funciona exitosamente con esta consulta:

let
 AccessTokenHeader = "CwsAuth Bearer=" & fnGetBearerToken(),
 // Uses the Citrix Cloud GET method using the bearer token from the previous POST oauth2/token method
 GetJsonQuery = Web.Contents("https://" & TenantId & ".xendesktop.net/Citrix/monitor/OData/v4/data/Users",
     [
         Headers = [#"Authorization"=AccessTokenHeader,
                    #"Customer"=TenantId]
     ]
 ),
 FormatAsJsonQuery = Json.Document(GetJsonQuery),
    value = FormatAsJsonQuery[value]
in
    value

Sin embargo, la consulta oData solo devuelve 100 registros, por lo que se requiere paginación, que puede ver que es compatible:

2020-03-31_203304.png

Aquí es donde ocurre el problema. Cuando consulto de forma iterativa la URL de nextLink, aparece el error de autenticación «No pudimos autenticarnos con la credencial proporcionada»

2020-03-31_210102.png

Aquí está el código utilizado:

let
 AccessTokenHeader = "CwsAuth Bearer=" & fnGetBearerToken(),
 
fnGetCitrixCloudOData = (Path as text, AccessTokenHeader as text) =>
let

    Source = Json.Document(Web.Contents(Path, 
        [
            Headers=[Authorization=AccessTokenHeader, Customer=TenantId]
        ])),

    // Assign the resultant List object to NextList variable
    NextList = @Source[value],

    // recursively call fnGetCitrixCloudOData function using the value of @odata.nextLink as the path
    // Since @odata.nextLink is not guaranteed to always exist in the case where the result is less 
    // than 100 we need to catch this and deal with it using a try otherwise basically means if you 
    // error out because no @odata.nextLink exists then just return the resulting list of values
    result = try @NextList & @fnGetCitrixCloudOData(Source[#"@odata.nextLink"], AccessTokenHeader) otherwise @NextList

in
    // Return the result variable as the function return
    result,

oData = fnGetCitrixCloudOData("https://" & TenantId & ".xendesktop.net/Citrix/monitor/OData/v4/data/Users", AccessTokenHeader)

in
    oData

También probé el método descrito en el blog, con el mismo resultado: https://datachant.com/2016/06/27/cursor-based-pagination-power-query/

Siendo bastante nuevo en M Query, me siento un poco fuera de mi alcance ahora, ¡así que agradezco cualquier ayuda!

Gracias,

jason

Hola @JasonP76,

No estoy familiarizado con la API de paginación, puede intentar consultar cómo-hacer-paginación-en-power-query para obtener más detalles o @Imkef (que es profesional en power query) u otros superusuarios para obtener más sugerencias.

Gracias por su comprensión y apoyo.
Atentamente,
zoe zhi

Si esta publicación le ayuda, considere aceptarla como la solución para ayudar a los otros miembros a encontrarla más rápidamente.

Deja un comentario

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