Incidentele foutmelding "Token is not allowed, because of invalid or empty chainId" op Exact Online

Bij het ophalen van een OAuth Access Token op Exact Online via https://start.exactonline.TLD/api/oauth2/token treedt sinds 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” bij het gebruik van het Invantive Query Tool is het gebruik van de Code Grant Flow met een verkeerd voorgaand refresh token. Alle refresh tokens dienen een ononderbroken keten te vormen indien de app het gebruik van “old refresh tokens” niet toestaat.

De melding is gerelateerd aan Itgenoda061: Massale "Token expired" errors op Exact Online sinds 24 juli, maar de foutmelding is afwijkend van de verwachte foutmelding:

Old refresh token used.

Een gelijkend probleem is Itgenoda219 op Exact Online: Error "Old refresh token used." bij verbinden.

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 volgende versie binnen logische grenzen het gebruik van de Code Grant Flow mogelijk maken.

“invalid or empty chainId” met Implicit Grant Flow

De foutmelding kan niet verklaard worden in combinatie met de Valuta Tools; die gebruikt alleen de Implicit Grant Flow. Mogelijkerwijs is dit een bug ergens in de keten.

In releases vanaf 20.1.525 zal deze foutmelding gekoppeld worden aan de code itgenoda494.

Meer uitleg over de “Old refresh token used.”-melding is te vinden op Exact Online foutmelding: Old refresh token used.

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:

name="data-replicator"
id="XYZ"
description="XYZ"
dataCacheConnectionString="provider=SqlServer;forced-casing-logical-view-column-name=Lower;forced-casing-logical-view-name=Lower;connectionString={Server=XYZ;Database=XYZ;User Id=XYZ;Password=XYZ}"
creationDate="2018-12-19T16:40:09.9010399+01:00">
<database
  order="0"
alias="eolbe"
  createdBy="XYZ"
  createdOn="XYZ"
  creationDate="2018-12-19T16:40:09.8880744+01:00"
  provider="ExactOnlineAll"
  userLogonCodeMode="Auto"
  passwordMode="Auto"
  connectionString="api-url=https://start.exactonline.be;api-redirect-url=https://exactonlineclientredirect.invantive.com;api-client-id=XYZ;api-client-secret=XYZ;api-refresh-token=XYZ" />

De refresh token die opgenomen is in de configuratie werd destijds vrijgeschakeld door Exact Online.

Moet hierbij een nieuwe refresh token ingesteld worden?

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:

Zoals beschreven in Old refresh token used zal een volgende versie binnen logische grenzen het gebruik van de Code Grant Flow mogelijk maken.

1 Like

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).

We see on the above screen cap the Tweetraps Geheim coming from the new TOTP in settings.xml.

After deletion of the two OAuth lines and one login, then the next login window will not show the OAuth anymore.

If this step is not done, then Query Tool keep an OAuth login instead of switching to TOTP.

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).

Helaas krijgen wij ook deze foutmelding.

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

<database
 order="10"
 alias="eolnl"
 provider="ExactOnlineAll"
 userLogonCodeMode="Hidden"
 passwordMode="Hidden"
 defaultUserLogonCode="MIJNGEBRUIKERSNAAM"
 defaultPassword="MIJNWACHTWOORD"
 connectionString="api-url=https://start.exactonline.nl;api-client-id=HOOPNUMMERS;api-redirect-url=https://exactonlineclientredirect.invantive.com;totp-secret=SECRETKEY"
 AllowConnectionStringRewrite="false"
/>

Kan iemand mij verder helpen? Ik hoor het graag!

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.

Update 1 oktober 2021

De Invantive Cloud release van 1 oktober maakt het eenvoudiger om de autorisatie te vernieuwen, bijvoorbeeld voor vervallen refresh tokens, zoals beschreven op Eenvoudiger autorisaties vernieuwen op Invantive Cloud.

Binnen Invantive Cloud zijn extra faciliteiten toegevoegd om het offline gaan van de Exact Online database te repareren en te voorkomen. Meer informatie hierover is te vinden op Auto-recovery van Exact Online datacontainers.