Bij het ophalen van een OAuth Access Token op Exact Online via https://start.exactonline.TLD/api/oauth2/token treedt sinds mei 2021 incidenteel een HTTP 400 (Bad Request) op met als boodschap:
{ "error":"invalid_grant"
, "error_description":"Token is not allowed, because of invalid or empty chainId"
}
Dit probleem trad eenmalig op in mei 2021 bij een developer met een eigen Exact Online client ID op Invantive Query Tool 20.0.
Sinds juli tot dusver alleen op op 21 juli bij het gebruik van de Implicit Grant Flow op Valuta Tools. Op 23 en 27 juli trad deze foutmelding op met het Invantive Query Tool in versie 20.0, gebruik makend van een refresh token.
âinvalid or empty chainIdâ met Code Grant Flow
De waarschijnlijk oorzaak van de melding âToken is not allowed, because of invalid or empty chainIdâ is het gebruik van de Code Grant Flow met een verkeerd voorgaand refresh token, bijvoorbeeld bij het gebruik van het Invantive Query Tool. Alle refresh tokens dienen op Exact Online een ononderbroken keten te vormen indien voor de app het gebruik van âold refresh tokensâ niet toegestaan is door Exact Online Support.
Waarschijnlijk is dit een minder fraaie foutmelding uit de Exact Online code waarbij eigenlijk de melding gegeven had moeten worden:
Old refresh token used
Vermoedelijk treedt deze melding op als een refresh token gebruikt wordt dat al ouder is en waarbij al een reeks van nieuwe refresh tokenwaardes is doorgegeven.
Advies is om voorlopig over te stappen op de Implicit Grant Flow zoals beschreven:
Zoals beschreven in Exact Online foutmelding: Old refresh token used zal een toekomstige versie binnen logische grenzen het gebruik van de Code Grant Flow mogelijk maken. Echter, de Exact Online Code Grant Flow dient hiervoor eerst bugvrij te zijn.
Sinds gisterenavond merken we deze fout ook op langs onze kant, zowel bij het opstarten van geplande vernieuwingen via Data Hub, als bij het opstarten van de Query Tool:
Token is not allowed, because of invalid or empty chainId.
The remote server returned an error: (400) Bad Request.
The provided authorization grant (e.g., authorization code, resource owner credentials) or refresh token is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client. https://start.exactonline.be/api/oauth2/token
Onze configuratiebestanden (XML) bevatten een configuratie in lijn met volgende, enkele zaken aangepast naar XYZ:
Op dit moment hebben we hiervoor geen oplossing. In een nieuwe versie die ergens de komende dagen beschikbaar zal komen zullen hiervoor een aantal verbeteringen doorgevoerd worden. Met deze toekomstige versie zal allereerst een nieuw refresh token gegenereerd moeten worden, en daarna dit telkens doorgegeven. Ook zal het niet meer mogelijk zijn om in clusterconfiguraties of multi-user te werken, omdat de synchronisatie van refresh tokens via de Invantive Keychain zal lopen.
Invantive Keychain is zoals beschreven in de link gebonden aan de OS-gebruiker en het apparaat.
Indien multi-user of clusterconfiguraties nodig zijn, adviseren we het gebruik van aparte Exact Online gebruikers en/of apparaten. Op termijn zal Bring Your Own App het mogelijk maken om het management van refresh tokens via Invantive Cloud te laten lopen.
Voorlopige Workaround
Advies is om voorlopig over te stappen van de Code Grant Flow naar de Implicit Grant Flow zoals beschreven:
Good morning,
To be added, when switching from OAuth to TOTP with Query Tool on an already existing database listed in settings.xml with a refresh token, like described here,
then on Query tool 20.1.529 it is mandatory to delete former OAuth informations on the login window (there are not in the settings.xml anymore but Query Tool has in its cache the last used refresh token).
That is correct. Up to release 20.1.529 the last value of the refresh token is memorized. Starting release 20.1.530 it should be possible to empty and/or change the value for refresh token as stored in Invantive Keychain. This release is scheduled for today (August 4).
invalid_grant: The data container with alias âeolnlâ could not be opened on provider âExactOnlineAllâ.
invalid_grant:
Token is not allowed, because of invalid or empty chainId The provided authorization grant (e.g., authorization code, resource owner credentials) or refresh token is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client.
De externe server heeft een fout geretourneerd:
(400) Ongeldige opdracht.
2021-08-02 11:47:44.471 Error invalid_grant: System.Net.WebException
ValidationException
bij System.Net.HttpWebRequest.GetResponse()
bij Invantive.Data.Providers.OData.ODataProvider.DoRequest(GlobalState owner, ExecutionOptions executionOptions, HttpWebRequest request, String url, ObjectDefinition objectDefinition, String partitionCode, String callSafeNameOverrule, String anonymizedPostText, Boolean allowRetryOnConnectionLoss, ExecutionStatistics& statistics, ODataErrorProcessingInstructions& oDataErrorProcessingInstructions)
2021-08-02 11:47:44.533 Question: Vraag: Wilt u de beschikbare databases ontdekken? Detectie zou een nieuwe database kunnen vinden.
De optie van Saudoyna werkt helaas niet. Hoe moet ik dit nu precies instellen?
Dit staat o.a. in de settings-naam.xml
De genoemde foutmelding over âToken is not allowedâ kan alleen optreden als er een refresh token gebruikt wordt. Echter, in de settings*.xml staat een zogenaamde âImplicit Grant Flowâ met een TOTP-secret. Die gebruikt geen refresh token.
Het lijkt er op dat een andere database gebruikt wordt dan gedefinieerd in de XML.
Advies is om alle settings*.xml te verplaatsen buiten de gewenste en nogmaals te proberen.
Mocht dat geen soelaas bieden, dan raad ik een kort consult aan.
Graag volg ik even op of er op vandaag reeds opnieuw een optie is om via een app & refresh token succesvol connectie te maken zodat gebruikersnaam en wachtwoord niet in de XML staan?
Op dit moment adviseren we om in enterprise-situaties de gebruikersnaam, wachtwoord en TOTP-secret op de server op te slaan. Zorg voor beveiliging op locatie (toegang) en kennis (OS-wachtwoord).
Het gebruik van het refresh token is mogelijk maar is uitgeschakeld. Het huidige ontwerp op Exact Online laat naar onze mening nog ruimte voor verbetering op het gebied van de beveiliging en het ouwerwetse RAS: Reliability, Availability en Serviceability, hetgeen leidt tot een groot aantal servicevragen en frequente storingen.
Voor de kortere termijn wordt het Bring Your Own App concept (Bring Your Own App voor Exact Online op Invantive Cloud) ook beschikbaar gemaakt voor de on-premises oplossingen. Het verwerven van een nieuw access token gebeurt dan in de cloud binnen de beveiligde Invantive Data Guard omgeving, terwijl de datatransfer direct tussen Exact Online en de on-premises devices gebeurt. Voor een deel van de doelgroep kan hiermee een afdoende alternatief geboden worden.
Vanuit een risicogewogen benadering vinden we dit voor de top-30 accountantskantoren geen voldoende alternatief omdat de refresh tokens hiermee buiten controle van de organisatie geplaatst worden. Voor de langere termijn wordt mogelijkerwijs de refresh token mogelijkheid opengesteld. Dit hangt primair af van de betrouwbaarheid.
Het gebruik van Implicit Grant Flow met TOTP-secret is nog steeds aan te raden wanneer u niet kunt garanderen dat alle runs van Exact Online niet parallel lopen (op dezelfde machine of over meerdere servers heen) en bovendien minimaal 10 minuten uit elkaar liggen. Het interval van 10 minuten tussen de runs is nodig vanwege de nieuwe Exact Online eis dat een toegangstoken niet vaker dan eens in de 9,5 minuut mag worden verkregen. Het vaker dan eens in de 9,5 minuten verversen van het access token leidt momenteel tot het ongeldig worden van alle refresh tokens. Deze eis wordt geleidelijk over de verschillende landen heen geactiveerd. In Nederland is de eis momenteel 10 seconden in plaats van 9,5 minuut.
Om het aantal keren dat het TOTP-secret wordt gebruikt te verminderen, kunt u het client secret van uw Exact Online app opnemen in settings*.xml door het toe te wijzen aan het connection string attribuut api-client-secret.
Dit stelt - waar mogelijk - de Invantive software in staat om Code Grant Flow te gebruiken met verbeterde runtime prestaties. Wanneer meerdere processen tegelijkertijd worden uitgevoerd, zal de software automatisch terugkeren naar Implicit Grant Flow.
De datacontainerinstelling in settings*.xml om automatisch de MFA-verificatiecode in te voeren bij programmastart, over te schakelen naar Code Grant Flow en dan zo lang mogelijk gebruik te blijven maken van Code Grant Flow ziet er als volgt uit:
Deze aanpassing geldt alleen voor on-premises installaties zoals van Invantive Data Replicator, Invantive Query Tool, Invantive Control for Excel en Invantive Data Hub. Op Invantive Cloud wordt gebruik gemaakt van een centraal synchronisatiepunt in Invantive Data Guard om het access token en refresh token op het juiste moment en consistent aan te vragen. Op Get My Report en Valuta Tools wordt bij elke aanmelding gestart met een nieuwe Code Grant Flow, inclusief invoeren van verificatiecode indien nodig. Get My Report en Valuta Tools worden gemigreerd naar Invantive Cloud.