Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.
Hi.
I need some help getting data from an API using OAuth & bearer token.
Here is the code that I currently have:
let
//Create the variables
TokenURL = "xxx",
clientId = "xxx",
clientSecret = "xxx",
//Create the Token Request
GetJson = Web.Contents(TokenURL,
[
Headers = [#"Content-Type"="application/json"],
Content = Text.ToBinary("{""clientId"":" & clientId &",""clientSecret"":"& clientSecret & "}"
) ]
),
FormatAsJson = Json.Document(GetJson),
// Gets token from the Json response
AccessToken = FormatAsJson[access_token],
AccessTokenHeader = "bearer " & AccessToken,
// ???
GetJsonQuery = Web.Contents("xxx",
[
Headers = [#"wb-authorization"=AccessTokenHeader]
]
),
FormatAsJsonQuery = Json.Document(GetJsonQuery)
in
#"FormatAsJsonQuery"
I am receiving an error DataSource.Error: Web.Contents failed to get contents from 'xxx' (400): Bad Request
So I suspect that my syntax may be incorrect on this line:
Content = Text.ToBinary("{""clientId"":" & clientId &",""clientSecret"":"& clientSecret & "}"
I have test the request in Postman using this curl and it works
curl --location --request POST 'xxx' \
--header 'Content-Type: application/json' \
--data-raw '{ "clientId": "xxx", "clientSecret": "xxx"
}'
Your problem is is Create the token request part , so just correct that part with this code, it will work.
let apiUrl = "https://login.windows.net/61xxxxxxxxxxxx/oauth2/token", body = [ client_id="3728xxxxxxxxxxxxxx5", client_secret="bxxxxxxxxxxxxh" ], Source = Json.Document(Web.Contents(apiUrl, [Headers = [Accept = "application/json"], Content = Text.ToBinary(Uri.BuildQueryString(body))])) in Source
Hi @pablopablo ,
Could you please use following query to see if the problem is in create the tekon request step?
let
//Create the variables
TokenURL = "xxx",
clientId = "xxx",
clientSecret = "xxx",
//Create the Token Request
GetJson = Web.Contents(TokenURL,[Headers = [#"Content-Type"="application/json"],Content = Text.ToBinary("{""clientId"":" & clientId &",""clientSecret"":"& clientSecret & "}")])
in
GetJson
we can also try to use some tools to see if power bi desktop has send the right web request, such as Fiddler Trace: https://docs.microsoft.com/en-us/power-bi/developer/embedded-troubleshoot
Best regards,
Hi,
I managed to get this working to the point where it is collecting a token and parsing it to the endpoint, however I am now getting an error - "Please specify how to conect"
code is:
/*
*/
let
//Create the variables
TokenURL = "xxx",
clientId = """xxx""",
clientSecret = """xxx""",
//Create the Token Request
GetJson = Web.Contents(TokenURL,
[
Headers = [#"Content-Type"="application/json"],
Content = Text.ToBinary("{""clientId"": " & clientId & ", ""clientSecret"": "& clientSecret & "}")
]
),
FormatAsJson = Json.Document(GetJson),
// Gets token from the Json response
AccessToken = FormatAsJson[access_token],
AccessTokenHeader = "bearer " & AccessToken,
// ???
GetJsonQuery = Web.Contents("xxx",
[
Headers=[#"wb-authorization"= AccessTokenHeader, ContentType="application/json"]
]
),
FormatAsJsonQuery = Json.Document(GetJsonQuery)
in
#"FormatAsJsonQuery"
Hi @pablopablo ,
It seems like add "" to the client fix the previous problem? If you got a warning like following, please try to edit with Anonymous since you have put the token inside the Header.
Best regards,
Yeah I added the Anonymous but now getting this error
'We couldn't authenticate with the credentials provided. Please try again'
However I can see it create the token and parse it through. I try the token in postman and it works successfully.
Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City
Check out the April 2024 Power BI update to learn about new features.