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

Go to English version

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.

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

Invantive Cloud kan ook last hebben van de Exact Online bugs. Het is mogelijk een automatisch herstel te configureren, zie Auto-recovery van Exact Online refresh tokens voor datacontainers.

Andere gerelateerde artikelen over het snel vervallen van refresh tokens en maximaal één combinatie van gebruiker en client ID 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:

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 Exact Online foutmelding: 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 (itgenscr652).

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 refresh tokens voor datacontainers.

Update TOTP/Exact Refresh Token november 2021

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:

      <database
       order="10"
       alias="eol"
       provider="ExactOnlineAll"
       userLogonCodeMode="Verborgen"
       passwordMode="Verborgen"
       defaultUserLogonCode="invantive1"
       standaardPaswoord="geheim"
       connectionString="api-url=https://start.exactonline.nl;api-client-id=GUID_VALUE;api-client-secret=ANOTHER_SECRET;api-redirect-url=https://URL;totp-secret=TOTP_SECRET"
       AllowConnectionStringRewrite="false"
      />

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.