OData met OAuth2 in Excel Power Query

Samenvatting

Excel heeft een geweldige Power toolbox om dashboards mee te maken in Excel. Met Power Query kan allerlei data opgehaald worden, maar als je een OData-bron hebt die met OAuth2 is beveiligd is daar geen ingebouwde optie voor in Excel. Daarom laat ik in deze blog een pragmatische work-around zien met drie stappen:

  1. Een OAuth2 access token ophalen met Power Query (M).
  2. Dat token gebruiken om via OData data op te halen.
  3. Een aanpak om het token her te gebruiken zodat je niet bij elk request een nieuw token hoeft aan te vragen.

Disclaimer

In deze blog laat ik zien hoe je met een M-script vanuit Excel Power Query gegevens kunt ophalen via OData met OAuth2. Dit is echter niet de door Microsoft aanbevolen aanpak. Als je veilig en betrouwbaar wilt verbinden met een REST-API die OAuth2-authenticatie gebruikt, dan moet je een custom connector bouwen voor Power BI. Gebruik de beschreven methode daarom alleen ter inspiratie of voor korte projecten in Excel.


Achtergrond

OData is een standaard manier om data via een API op te vragen en te filteren, een beetje zoals zoeken in een online database. Steeds meer OData gegevensbronnen zijn echter beveiligd met OAuth2. Excel Power Query is gebouwd rond het idee dat de connector de authenticatie regelt, maar voor OAuth2 is geen connector beschikbaar in Excel. Dat komt door het token-mechanisme van OAuth2.

OAuth2 draait om tokens. Bij een token endpoint vraag je een token aan met je client ID en client secret, een soort gebruikersnaam en wachtwoord. Dat token stuur je mee naar de API waardoor je toegang krijgt tot de data. Tokens verlopen (bijv. 60 min) waarna een nieuw token aangevraagd moet worden.

Dit token mechanisme is het beste te vergelijken met armbandjes op een festival. Met je ticket (client ID en secret) haal je bij de kassa (token endpoint) je armband (token) op. Vervolgens mag je met dit armbandje overal op het festival (online database) komen.

Stap 1: OAuth2 token ophalen met Power Query

De eerste stap is een functie waarmee Power Query een token kan ophalen. Zorg dat je de volgende gegevens bij de hand hebt. Deze zijn minimaal nodig om een OAuth2 token op te halen:

  • Token endpoint (bijv. https://…/Oauth/Token)
  • OData base URL (bijv. https://…/odata)
  • client_id
  • client_secret
  • scope of resource/audience (bijv. r_Odata)

Praktische tip: maak in Excel Power Query Parameters aan voor deze waarden. Dit houdt je M-code schoner.

Maak in Power Query een Lege query aan (via de ribbon Gegevens -> Gegevens ophalen -> Uit andere bronnen). De Power Query editor opent vanzelf. Open daarin de Geavanceerde Editor (via de ribbon Start in de Power Query editor), en plak het onderstaande M-script. Wijzig de naam (rechtboven in de editor) van deze functie naar GetAccessToken.

Stap 2: Odata ophalen met je token

Nu kunnen we de GetAccessToken functie gebruiken om met een token data op te halen via OData. Maak opnieuw in Power Query een lege query aan. Open weer de Geavanceerde Editor en plak dit M-script. Dit script dient als een basis, en kan naar eigen wens worden aangepast. Zo is het mogelijk om een ODataQueryParameter aan te maken met daarin query opties om data mee te filteren.

Stap 3: Token hergebruiken

Een veelgemaakte fout is om in elke query een nieuw token op te halen. Dat is traag en kan je token endpoint belasten. Daarom is het handig om een losse query te maken die alleen een token ophaalt. Andere query’s kunnen hieraan refereren zodat hetzelfde token meerdere keren wordt gebruikt. Zie het M-script hieronder. Noem deze query GetToken.

In je andere queries kun je vervolgens zo een token inladen:

Deze opzet is ook heel nuttig omdat veel OData-services niet in één keer alle resultaten aanleveren, maar deze pagineren. Je krijgt dan per response bijvoorbeeld de eerste 1.000 rijen terug, plus een next page link die je naar de volgende batch wijst. In OData v4 heet die meestal: @odata.nextLink. Volg deze link om opeenvolgende pagina’s binnen te halen totdat er geen link meer is.

Hiervoor geldt dat je de @odata.nextLink altijs “as-is” moet gebruiken. Let ook op dat sommige APIs next links alleen teruggeven als je een server-side page size overschrijdt. Je moet dan bewust over de resultaten-per-pagina limiet gaan in je request.

Troubleshooting

Hieronder staan de fouten die vaak voorkomen, en wat ze betekenen. Omdat het basis M-script van stap 2 ManualStatusHandling gebruikt zijn de statuscodes en error-body duidelijk inzichtelijk.

  • 401 Unauthorized: token ontbreekt / verkeerd meegestuurd, het token is verlopen, of de audience/resource is verkeerd.
  • 403 Forbidden: token is geldig, maar je app/user heeft geen rechten.
  • invalid_client: client_id en/of secret zijn fout.
  • invalid_scope: scope verkeerd (of resource i.p.v. scope verwacht).
  • 429 Too Many Requests: te veel token aanvragen of OData calls.

Conclusie

Met deze aanpak kun je in Excel Power Query tóch met OAuth2-beveiligde OData-bronnen werken: je haalt een access token op, gebruikt dat als header in OData.Feed(), en hergebruikt het token zodat je niet onnodig vaak opnieuw authenticatie doet. Zie dit wel als een praktische workaround voor prototypes en korte trajecten—voor robuuste, gedeelde of productie-oplossingen blijft een connector- of platformoplossing de veiligste en meest onderhoudbare route.

Hulp nodig bij het veilig inrichten van OAuth2/OData of het productierijp maken van deze oplossing? Neem gerust contact op—dan kijken we mee naar een robuuste aanpak die past bij jullie omgeving.

Over Excel!ent

Wij zijn Rick van Reeuwijk en Robbert den Butter, vrienden met een gezamenlijke passie voor slimme oplossingen in Excel. Vanuit die gedeelde interesse besloten we onze krachten te bundelen en bedrijven te helpen méér uit Excel te halen.

Of je nu een slim bestand zoekt dat je direct kunt gebruiken, een volledige maatwerkoplossing nodig hebt of zelf je Excel-vaardigheden wilt verbeteren – wij hebben de dienst die bij jou past.


Comments

Geef een reactie

Ontdek meer van Excel!ent

Abonneer je nu om meer te lezen en toegang te krijgen tot het volledige archief.

Lees verder